Flutter 如何在flatter中将字符串中的一小时(而不是日期)从UTC转换为localtime?

Flutter 如何在flatter中将字符串中的一小时(而不是日期)从UTC转换为localtime?,flutter,datetime,dart,timezone,Flutter,Datetime,Dart,Timezone,我使用的API声明如下: 注意:所有时间均以UTC为单位,夏季时间调整不包括在返回的数据中 因此,我检索数据如下: String time = "3:52:59 PM"; final convertedTime = DateTime.parse(time).toLocal(); print(convertedTime.toString()); 我想将该时间作为电话本地时间,因此根据类似的日期问题,它将如下所示: String time = "3:52:59 PM

我使用的API声明如下:

注意:所有时间均以UTC为单位,夏季时间调整不包括在返回的数据中

因此,我检索数据如下:

String time = "3:52:59 PM";
final convertedTime = DateTime.parse(time).toLocal();
print(convertedTime.toString());
我想将该时间作为电话本地时间,因此根据类似的日期问题,它将如下所示:

String time = "3:52:59 PM";
final convertedTime = DateTime.parse(time).toLocal();
print(convertedTime.toString());
但这会产生一个错误:

无效的日期格式

我猜这个问题是因为date time需要一个日期,而不仅仅是几个小时,但我无法在
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);
}
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)(现在我指的是DST以外的时间)。

如果您知道收到的时间是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);
}
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)(现在我指的是DST以外的时间)。

如果您没有任何日期,如果UTC->localtime转换在另一天结束,时间应该是什么?你将如何处理DST?(我想说的是…这个API没有给出任何日期似乎真的很奇怪。如果没有任何日期,从UTC转换到localtime的概念就没有任何意义)echo@julemand101-您需要一个日期来正确执行此操作。即使您想使用“今天”,在过渡期间也有可能出现一次一次的错误,因为根据时区的不同,当前UTC日期可能与当前本地日期不同。在字符串格式上,您可以使用并传递UTC的
true
。虽然您仍然需要一个日期,否则它将默认为
1970-01-01
@julemand101,但我刚刚查看了它,查询是“今天”,但是UTC时间的今天,我不知道是否可以使用设备的“今天”。@MattJohnson Pint它会崩溃,日期格式无效
除非您没有任何日期,如果UTC->localtime转换在不同的日期结束,时间应该是什么?你将如何处理DST?(我想说的是…这个API没有给出任何日期似乎真的很奇怪。如果没有任何日期,从UTC转换到localtime的概念就没有任何意义)echo@julemand101-您需要一个日期来正确执行此操作。即使您想使用“今天”,在过渡期间也有可能出现一次一次的错误,因为根据时区的不同,当前UTC日期可能与当前本地日期不同。在字符串格式上,您可以使用并传递UTC的
true
。尽管您仍然需要日期,否则它将默认为
1970-01-01
@julemand101,但我刚刚查看了它,查询为“今天”,但它是UTC时间的今天,我不知道我是否可以只使用设备的“今天”。@MattJohnson Pint它因
无效日期格式
例外而崩溃这是一个很好的答案,但遇到了一些问题,因为正则表达式似乎只使用双引号:
最终正则表达式_timePattern=RegExp(r)(?\d+:(?\d+(?\AM | PM)”
(我没有保留秒数).@AntoninGAVREL不确定你在做什么,但如果你在Dart中使用
作为
字符串
,那应该无关紧要,除非你的
字符串本身包含
(在我的回答中不是这样的)。因此,我猜您在通过应答进行复制时犯了错误。如果没有,您能告诉我您得到了什么错误吗?您可以在此处阅读有关如何在Dart中表示
字符串的内容:@AntoninGAVREL解决方案的一个细节是,该解决方案是在Dart中引入空安全性之前完成的,因此它没有任何潜在n的处理
match
的完整值,或者来自
namedGroup
的结果。我知道,只是告诉你奇怪的是,它不使用单引号。这是一个很好的答案,但有一些问题,因为正则表达式似乎只使用双引号:
final RegExp _timePattern=RegExp(r)(?\d+)(?\d+(.AM.\PM)”
(我没有保留秒)@AntoninGAVREL不确定你在做什么,但如果你在Dart中使用
作为
字符串
,那应该无关紧要,除非你的
字符串本身包含
(在我的回答中不是这样)。因此,我猜你在抄写答案时犯了一个错误。如果没有,你能告诉我你得到了什么错误吗?您可以在此处阅读有关如何在Dart中表示
字符串的内容:@AntoninGAVREL关于解决方案的一个细节是,它是在Dart中引入空安全之前制作的,因此它没有任何处理
match
的潜在空值或
namedGroup
的结果。我知道,只是告诉你,奇怪的是,它不是单一报价工作。