Dart?flutter 似乎不允许在创建 DateTime 对象时指定时区(例如:“澳大利亚/悉尼”或“美国/底特律”)。将使用本地时区,或者可以指定 UT。
有人知道解决方法吗?
有 Dart 包 TimeZone,但它似乎在 flutter 应用程序中无法使用。
请参阅 https://pub.dartlang.org/packages/timezone 了解我所指的包。
编辑:时区包确实可以在 Flutter 中工作,只需进行一些设置。请参阅下面理查德·希普的回答。
你必须施展一些魔法才能让
package:timezone
在 flutter 中工作。
提取您需要的数据文件(有 3 个:默认、全部和 2010-2020)并将其移动到您的 flutter asset 文件夹中。 (我用的是
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"
这个解决方案对我有用
简单地在 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));
}
TimeZone 包确实有效。来自 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
包确实可以工作,但需要在资产部分下手动添加tzf文件并使用如上所述的initializeTimeZones()
初始化包。
timezone
包的替代方案是 sugar
。它不需要在项目的 pubspec.yaml 的资产部分下添加其他文件或初始化包。
要使用该包,只需创建一个
ZonedDateTime
(相当于 TzDateTime
):
import 'package:sugar/sugar.dart';
void currentTime() {
final now = ZonedDateTime.now(Timezone('Europe/Zurich'));
}
要安装
sugar
软件包:
dependencies:
sugar: ^3.0.0
请参阅项目的页面了解更多信息。
你可以使用这个包来实现它。
依赖关系: flutter_timezone: ^3.0.1
用法
final String currentTimeZone = await FlutterTimezone.getLocalTimezone();