【问题标题】:How to specify a TimeZone when creating a DateTime object in Dart/Flutter?在 Dart/Flutter 中创建 DateTime 对象时如何指定 TimeZone?
【发布时间】:2018-06-10 02:38:48
【问题描述】:

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

有人知道解决方法吗?

有 Dart 包 TimeZone,但它似乎无法在颤振应用中使用。

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

编辑:时区包确实可以在 Flutter 中使用,但需要进行一些设置。请参阅下面 Richard Heap 的回答。

【问题讨论】:

  • 在 Dart 或 Flutter 中不支持该功能。为什么你认为时区包不能在 Flutter 中使用?
  • timezone 插件可以正常工作。
  • TimeZone 包确实有效。

标签: date dart flutter


【解决方案1】:

这个解决方案对我有用

在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));
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 从哪里获得“2018c_2010-2020.tzf”文件?
    • 来自the github repo 请注意更新后的readme,其中包含有关如何从main() 加载数据库的建议
    【解决方案3】:

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

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

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

    flutter:
      assets:
        - packages/timezone/lib/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');
    });
    

    【讨论】:

    • 需要注意的是,在您的应用中包含包资产时,需要排除路径的 lib 部分。 Flutter Docs 所以packages/timezone/lib/data/2015b.tzf 应该是packages/timezone/data/2015b.tzf
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2012-05-16
    相关资源
    最近更新 更多