我正在使用一个API,它声明如下:
注意:所有时间都是UTC时间,返回的数据不包括夏令时调整。
所以我按如下方式检索数据:
String time = "3:52:59 PM";
我想把那个时间作为电话的本地时间,所以根据一个类似的日期问题,它将如下所示:
final convertedTime = DateTime.parse(time).toLocal();
print(convertedTime.toString());
但是这会产生一个错误:
日期格式无效
我猜这个问题是因为日期时间期望日期而不仅仅是小时,但我无法在import 'package:intl/intl.dart';
中找到任何其他时间
我如何进行这种转换,例如考虑到夏令时或手机的任何其他时区的GMT+1 ?
在我的例子中,期望时间是:
String time = "4:52:59 PM";
如果你知道接收到的时间是UTC并且日期是"今天";在UTC时间,我们可以这样做:
void main() {
print(parseHoursInUtc('3:52:59 PM')); // 2021-01-21 15:52:59.000Z
}
RegExp _timePattern =
RegExp(r'(?<hour>d+):(?<minute>d+):(?<second>d+) (?<amPm>AM|PM)');
// timeString must be of the format "3:52:59 PM"
DateTime parseHoursInUtc(String timeString) {
final match = _timePattern.firstMatch(timeString);
final hour = int.parse(match.namedGroup('hour'));
final minute = int.parse(match.namedGroup('minute'));
final second = int.parse(match.namedGroup('second'));
final isPm = match.namedGroup('amPm') == 'PM';
final now = DateTime.now().toUtc();
return DateTime.utc(
now.year, now.month, now.day, isPm ? hour + 12 : hour, minute, second);
}
方法返回UTC模式的DateTime
,您可以使用toLocal()
将其转换为本地时间。
然后您可以使用intl
包创建一个DateTimeFormat
,它可以像这样打印您想要的时间:
import 'package:intl/intl.dart';
void main() {
print(DateFormat.jms().format(parseHoursInUtc('3:52:59 PM').toLocal())); // 4:52:59 PM
}
RegExp _timePattern =
RegExp(r'(?<hour>d+):(?<minute>d+):(?<second>d+) (?<amPm>AM|PM)');
// timeString must be of the format "3:52:59 PM"
DateTime parseHoursInUtc(String timeString) {
final match = _timePattern.firstMatch(timeString);
final hour = int.parse(match.namedGroup('hour'));
final minute = int.parse(match.namedGroup('minute'));
final second = int.parse(match.namedGroup('second'));
final isPm = match.namedGroup('amPm') == 'PM';
final now = DateTime.now().toUtc();
return DateTime.utc(
now.year, now.month, now.day, isPm ? hour + 12 : hour, minute, second);
}
我现在在丹麦,这里的时间是CET (UTC+1)(这里的现在是指夏令时以外的时间)。
要获取处于抖动状态的任何日期的时间,可以使用:
DateFormat("hh:mm aaa").format(DateTime.now()))
结果:5:40 p.m.