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
有关更多信息,请参阅项目页面。