您的问题是您尝试使用模式"HH:mm a" 解析"2020-07-17T03:18:31.177769-04:00",这是不可能的,因为模式甚至不接近提供的字符串。
相反,您真正想要的是将日期时间字符串解析为DateTime 对象并使用您的DateFormat 将DateTime 转换为String。由于您提供的日期时间字符串已格式化为 dart 可以立即解析的格式,因此我们可以使用 DateTime.parse。
可以在这里看到一个例子:
import 'package:intl/intl.dart';
void main() {
const dateTimeString = '2020-07-17T03:18:31.177769-04:00';
final dateTime = DateTime.parse(dateTimeString);
final format = DateFormat('HH:mm a');
final clockString = format.format(dateTime);
print(clockString); // 07:18 AM
}
关于时钟,如果字符串中提供了时区,默认情况下会将日期时间解析为UTC。
您可以通过以下方式输出当地时间:
final clockString = format.format(dateTime.toLocal());
但这个解决方案当然只有在您自己的计算机具有时区偏移“-04:00”时才有效。但这将是最正确的解决方案,因为DateTime 的内部状态是正确的。
如果您想将日期时间字符串直接解析为本地时间,我认为最简单的方法是删除日期时间字符串的时区部分,例如:
final dateTime = DateTime.parse(dateTimeString.replaceFirst(RegExp(r'-\d\d:\d\d'), ''));
这将给出一个 DateTime 对象,其中包含本地时间,并将根据需要打印您的时间戳:
import 'package:intl/intl.dart';
void main() {
const dateTimeString = '2020-07-17T03:18:31.177769-04:00';
final dateTime =
DateTime.parse(dateTimeString.replaceFirst(RegExp(r'-\d\d:\d\d'), ''));
final format = DateFormat('HH:mm a');
final clockString = format.format(dateTime);
print(clockString); // 03:18 AM
}