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



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

有没有人知道解决方法?

有Dart包时区,但它似乎在颤振应用程序中无法使用。

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

编辑:时区包确实可以在Flutter中工作,并进行一些设置。请参阅下面Richard Heap的答案。

你必须做一些魔法才能让package:timezone在颤振中工作。

提取您需要的任何数据文件(有 3 个:默认、全部和 2010-2020(,并将其移动到您的 Flutter 资产文件夹中。(我使用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

。但看起来你只需要从酒吧获取 0.5.0-dev-2

dependencies:
timezone: "^0.5.0-dev-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));
}

时区包确实有效。从 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');
});

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

Dart 的DateTime不支持时区。

timezone包确实有效,但它需要在 assets 部分下手动添加 tzf 文件并使用如上所述initializeTimeZones()初始化包。

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

要使用包,只需创建一个ZonedDateTime(相当于TzDateTime(:

import 'package:sugar/sugar.dart';
void currentTime() {
final now = ZonedDateTime.now(Timezone('Europe/Zurich'));
}

要安装sugar软件包,请执行以下操作:

dependencies:
sugar: ^3.0.0

有关更多信息,请参阅项目页面。

最新更新