Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Dart DateTime.parse timeZoneOffset始终为0_Flutter_Datetime_Dart_Iso - Fatal编程技术网

Flutter Dart DateTime.parse timeZoneOffset始终为0

Flutter Dart DateTime.parse timeZoneOffset始终为0,flutter,datetime,dart,iso,Flutter,Datetime,Dart,Iso,DateTime.parse创建的DateTime似乎总是为timeZoneOffset返回0 我在非UTC时区中创建ISO8601字符串: 我将该字符串传递给DateTime.parse: 问题:timeZoneOffset在我预期+0900时为0。 Dart日期时间文档: 结果始终为本地时间或UTC。如果指定了UTC以外的时区偏移,则时间将转换为等效的UTC时间 为什么时区偏移为0?我需要传递什么字符串到DateTime.parse以使其以本地时间存储时间,而不是将其转换为等效的UTC时间?

DateTime.parse创建的DateTime似乎总是为timeZoneOffset返回0

我在非UTC时区中创建ISO8601字符串:

我将该字符串传递给DateTime.parse:

问题:timeZoneOffset在我预期+0900时为0。 Dart日期时间文档:

结果始终为本地时间或UTC。如果指定了UTC以外的时区偏移,则时间将转换为等效的UTC时间


为什么时区偏移为0?我需要传递什么字符串到DateTime.parse以使其以本地时间存储时间,而不是将其转换为等效的UTC时间?

Dart SDK实际上不处理不同的时区,这就是parse需要本地时区的原因,本地时区是运行程序或UTC的系统上的时区

如果您试图在没有任何时区信息的情况下解析时间戳,Dart将假定时间在本地时区,我在丹麦,使用的是浪漫标准时区:

void main() {
  print(DateTime.parse("2021-01-07T18:05:18").timeZoneName); // Romance Standard Time
  print(DateTime.parse("2021-01-07T18:05:18+0900").timeZoneName); // UTC
}
您可以使用时间戳上的.toLocal将UTC时间戳转换为本地时间。但同样,这只会将其转换为您自己系统上的时区,而不是您解析时的时区:

void main() {
  print(DateTime.parse("2021-01-07T18:05:18+0900").toLocal().timeZoneName); // Romance Standard Time
}
如果要使用时区数据处理时间,应查看软件包时区:

关于保存时区偏移的一些注意事项 您应该知道,在大多数情况下,将时间保存在可以再次获取原始偏移的表单中是没有意义的。问题是,大多数国家都有DST或用户正在旅行等规则,并且希望系统能够正确处理时间

因此,在很多情况下,用户并不希望再次获得相同的偏移量,而是希望时间与当前偏移量保持一致,这取决于当前的位置和时间

例如,时区包不允许您解析时间戳并将偏移量与其一起保存,因为偏移量与位置不同。相反,它希望您指定时间戳用于的位置,以便计算该位置的当前偏移量

因此,一般来说,我建议您在存储上始终节省UTC时间。当要使用数据时,您应该有一些方法知道接收器的位置,例如,以某种形式的配置文件询问用户,并使用时区包将时间转换到该位置。如果应用程序在数据接收方拥有的设备上运行,则可以使用.toLocale将UTC转换为本地时间

void main() {
  print(DateTime.parse("2021-01-07T18:05:18").timeZoneName); // Romance Standard Time
  print(DateTime.parse("2021-01-07T18:05:18+0900").timeZoneName); // UTC
}
void main() {
  print(DateTime.parse("2021-01-07T18:05:18+0900").toLocal().timeZoneName); // Romance Standard Time
}