在创建DateTime对象时,Dart?flutter似乎不允许指定时区(例如:“Australia / Sydney”或“America / Detroit”) . 将使用本地时区,或者可以指定UT .
有人知道解决方法吗?
有Dart包TimeZone,但似乎无法在flutter应用程序中使用 .
见https://pub.dartlang.org/packages/timezone
你必须做一些魔术让 package:timezone 在颤动中工作 .
package:timezone
提取您需要的任何数据文件(有3个:默认,全部和2010-2020)并将其移动到您的flutter assets文件夹 . (我使用 2018c_2010-2020.tzf ,它在分支中可用 . )
2018c_2010-2020.tzf
在 pubspec.yaml 中将其添加为资产:
pubspec.yaml
assets: - assets/2018c_2010-2020.tzf
然后在启动时加载该文件(例如,从顶级StatefulWidget的 initState )并使用它来初始化数据库 .
initState
ByteData tzf = await rootBundle.load('assets/2018c_2010-2020.tzf'); initializeDatabase(tzf.buffer.asUint8List()); ... Location newYork = getLocation('US/Eastern');
我没试过,但如果你把它标记为异步,你甚至可以从 main 加载它 .
main
我也注意到我必须克隆最新的分支,正如我在pubspec中看到的那样
timezone: path: ../../dart/source/timezone
...但看起来你只需要从酒吧拿下0.5.0-dev-2
dependencies: timezone: "^0.5.0-dev-2"
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'); });
2 回答
你必须做一些魔术让
package:timezone
在颤动中工作 .提取您需要的任何数据文件(有3个:默认,全部和2010-2020)并将其移动到您的flutter assets文件夹 . (我使用
2018c_2010-2020.tzf
,它在分支中可用 . )在
pubspec.yaml
中将其添加为资产:然后在启动时加载该文件(例如,从顶级StatefulWidget的
initState
)并使用它来初始化数据库 .我没试过,但如果你把它标记为异步,你甚至可以从
main
加载它 .我也注意到我必须克隆最新的分支,正如我在pubspec中看到的那样
...但看起来你只需要从酒吧拿下0.5.0-dev-2
TimeZone包确实有效 . 从GitHub上的问题列表:
对不起,花了6个月,但我有一个很好的解决方案 . 我认为这将是推荐的解决方案 .
请参阅Flutter关于添加资产的文档 . 您应该可以添加到Flutter应用程序的pubspec.yaml:
并在您的应用中加载: