首页 文章

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

提问于
浏览
1

在创建DateTime对象时,Dart?flutter似乎不允许指定时区(例如:“Australia / Sydney”或“America / Detroit”) . 将使用本地时区,或者可以指定UT .

有人知道解决方法吗?

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

https://pub.dartlang.org/packages/timezone

2 回答

  • 0

    你必须做一些魔术让 package:timezone 在颤动中工作 .

    提取您需要的任何数据文件(有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');
    

    我没试过,但如果你把它标记为异步,你甚至可以从 main 加载它 .

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

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

    ...但看起来你只需要从酒吧拿下0.5.0-dev-2

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

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

相关问题