在Dart/Flutter中创建DateTime对象时如何指定TimeZone?

问题描述 投票:0回答:5

Dart?flutter 似乎不允许在创建 DateTime 对象时指定时区(例如:“澳大利亚/悉尼”或“美国/底特律”)。将使用本地时区,或者可以指定 UT。

有人知道解决方法吗?

有 Dart 包 TimeZone,但它似乎在 flutter 应用程序中无法使用。

请参阅 https://pub.dartlang.org/packages/timezone 了解我所指的包。

编辑:时区包确实可以在 Flutter 中工作,只需进行一些设置。请参阅下面理查德·希普的回答。

date dart flutter
5个回答
14
投票

你必须施展一些魔法才能让

package:timezone
在 flutter 中工作。

提取您需要的数据文件(有 3 个:默认、全部和 2010-2020)并将其移动到您的 flutter asset 文件夹中。 (我用的是

2018c_2010-2020.tzf
,分行里有卖。)

将其添加为资产

pubspec.yaml
:

  assets:
    - assets/2018c_2010-2020.tzf

然后在启动时加载该文件(例如,从顶级 StatefulWidget 的

initState
)并使用它来初始化数据库。

ByteData tzf = await rootBundle.load('assets/2018c_2010-2020.tzf');
initializeDatabase(tzf.buffer.asUint8List());
...
Location newYork = getLocation('US/Eastern');

我还没有尝试过,但如果您将其标记为异步,您甚至可以从

main
加载它。

我还注意到我必须克隆最新的分支,正如我在我的 pubspec 中看到的那样

  timezone:
    path: ../../dart/source/timezone

...但看起来你只需要从 pub 获取 0.5.0-dev-2

dependencies:
  timezone: "^0.5.0-dev-2"

2
投票

这个解决方案对我有用

简单地在 initState 中添加这些行


import 'package:timezone/timezone.dart' as tz;
import 'package:timezone/data/latest.dart' as tz;
 @override
  void initState() {
   super.initState();
   tz.initializeTimeZones();
   final String locationName = await FlutterNativeTimezone.getLocalTimezone();
   tz.setLocalLocation(tz.getLocation(locationName));
}

1
投票

TimeZone 包确实有效。来自 GitHub 上的问题列表:

抱歉,这花了 6 个月的时间,但我有一个很好的解决方案。我认为这将是推荐的解决方案。

请参阅 Flutter 关于添加资产的文档。您应该能够添加到 Flutter 应用程序的 pubspec.yaml:

flutter:
  assets:
    - packages/timezone/data/2015b.tzf

并在您的应用程序中加载:

Future<List<int>> loadDefaultData() async {
  var byteData = await rootBundle.load('packages/timezone/data/2015b.tzf');
  return byteData.buffer.asUint8List();
}

// Call the above with something like:

loadDefaultData().then((rawData) {
  initializeDatabase(rawData);
  var zurich = getLocation('Europe/Zurich');
});

1
投票

免责声明:我是Sugar的作者之一。

Dart 的

DateTime
不支持时区。

timezone
包确实可以工作,但需要在资产部分下手动添加tzf文件并使用如上所述的
initializeTimeZones()
初始化包。

timezone
包的替代方案是
sugar
。它不需要在项目的 pubspec.yaml 的资产部分下添加其他文件或初始化包。

要使用该包,只需创建一个

ZonedDateTime
(相当于
TzDateTime
):

import 'package:sugar/sugar.dart';

void currentTime() {
  final now = ZonedDateTime.now(Timezone('Europe/Zurich'));
}

要安装

sugar
软件包:

dependencies:
  sugar: ^3.0.0

请参阅项目的页面了解更多信息。


0
投票

你可以使用这个包来实现它。

依赖关系: flutter_timezone: ^3.0.1

用法

final String currentTimeZone = await FlutterTimezone.getLocalTimezone();
© www.soinside.com 2019 - 2024. All rights reserved.