如何将字符串中的一个小时(不是日期)从UTC转换为颤振中的本地时间?



我正在使用一个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.

最新更新