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

rekjcdws  于 2023-05-19  发布在  Flutter
关注(0)|答案(4)|浏览(431)

dart ?扑似乎不允许时区(例如:“澳大利亚/悉尼”或“美国/底特律”)。将使用本地时区,或者可以指定UT。
有人知道变通办法吗?
有一个Dart包TimeZone,但它在Flutter应用程序中似乎无法使用。
请参阅https://pub.dartlang.org/packages/timezone了解我所指的软件包。
编辑:时区包在Flutter中工作,有一些设置。下面是Richard Heap的回答。

j2qf4p5b

j2qf4p5b1#

你必须做一些魔术让package:timezone在flutter中工作。
提取您需要的任何数据文件(有3个:默认值,所有和2010-2020),并将其移动到flutter assets文件夹。(我使用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');

我没有尝试过,但是如果你把它标记为async,你甚至可以从main加载它。
我还注意到,我必须克隆最新的分支,因为我看到这在我的pubspec

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

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

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

5cnsuln72#

这个解决办法对我很有效
简单地在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));
}
vjrehmav

vjrehmav3#

时区包确实起作用。从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');
});
zf9nrax1

zf9nrax14#

**免责声明:**我是《糖》的作者之一。

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

有关更多信息,请参阅项目的page

相关问题