我是 flutter 的新手,我的休息 api 采用当前时区作为欧洲/伦敦。我不知道在颤振中获取当前时区。堆栈溢出中有一个关于这个主题的问题,但没有用户给出答案。
颤振时区(作为 ZoneId)
谁能指导我,我如何使用飞镖获得当前时区的颤振。
DateTime
是默认类,使用时区和时间偏移量来解决时区相关问题。
DateTime dateTime = DateTime.now();
print(dateTime.timeZoneName);
print(dateTime.timeZoneOffset);
输出:
1. 印度
timeZoneName: IST
timeZoneOffset: 5:30:00.000000
2. 美国/Los_Angeles
timeZoneName: PST
timeZoneOffset: -8:00:00.000000
时区列表:https://help.syncfusion.com/flutter/calendar/timezone
有一个很棒的库: https://pub.dev/packages/flutter_native_timezone
///时区名称。 此值由 操作系统,可以是///缩写或全名.
//////在浏览器或类 Unix 系统上通常返回 缩写,///例如"CET"或"CEST"。在 Windows 上返回 全名,例如///"太平洋标准时间".external String get timeZoneName;
时区偏移量,其中///是两者之间的差异 当地时间和世界协调时。 时区的偏移量为正数 世界协调时以东。 注意,JavaScript、Python 和 C 返回 UTC 和///本地时间之间的差异。Java、C# 和 Ruby 返回本地时间与///UTC.
值external Duration get timeZoneOffset;
之间的差
DateTime.now().timeZoneName
如果时间实例采用 UTC。
timeInstance.toLocal().timeZoneName
此外
DateTime 类不提供国际化。 国际化您的代码,使用///国际套餐。
或
要获取Europe/Moscow
格式的时区,请执行以下操作: 从这里:使用flutter_native_timezone
final String currentTimeZone = await FlutterNativeTimezone.getLocalTimezone();
print(currentTimeZone); // Europe/Moscow
// Use this
Map timezoneNames = {
0: 'UTC',
10800000: 'Indian/Mayotte',
3600000: 'Europe/London',
7200000: 'Europe/Zurich',
-32400000: 'Pacific/Gambier',
-28800000: 'US/Alaska',
-14400000: 'US/Eastern',
-10800000: 'Canada/Atlantic',
-18000000: 'US/Central',
-21600000: 'US/Mountain',
-25200000: 'US/Pacific',
-7200000: 'Atlantic/South_Georgia',
-9000000: 'Canada/Newfoundland',
39600000: 'Pacific/Pohnpei',
25200000: 'Indian/Christmas',
36000000: 'Pacific/Saipan',
18000000: 'Indian/Maldives',
46800000: 'Pacific/Tongatapu',
21600000: 'Indian/Chagos',
43200000: 'Pacific/Wallis',
14400000: 'Indian/Reunion',
28800000: 'Australia/Perth',
32400000: 'Pacific/Palau',
19800000: 'Asia/Kolkata',
16200000: 'Asia/Kabul',
20700000: 'Asia/Kathmandu',
23400000: 'Indian/Cocos',
12600000: 'Asia/Tehran',
-3600000: 'Atlantic/Cape_Verde',
37800000: 'Australia/Broken_Hill',
34200000: 'Australia/Darwin',
31500000: 'Australia/Eucla',
49500000: 'Pacific/Chatham',
-36000000: 'US/Hawaii',
50400000: 'Pacific/Kiritimati',
-34200000: 'Pacific/Marquesas',
-39600000: 'Pacific/Pago_Pago'
};
data[DateTime.now().timeZoneOffset.inMilliseconds] // Ex : Indian/Mayotte
https://pub.dartlang.org/packages/timezone https://docs.flutter.io/flutter/dart-core/DateTime/timeZoneOffset.html 可能适合您。
您始终可以通过构建 https://flutter.io/docs/development/packages-and-plugins/developing-packages#developing-plugin-packages 使本机功能可用于 Flutter
https://github.com/flutter/flutter/issues/12531 也有些相关。
Dart不直接为平台提供tz时区,但是可以使用以下两个属性和一个映射来确定tz时区。
(1)DateTime.now().timeZoneName
属性给出时区缩写(在 Windows 上它给出一个全名)。仅此缩写不足以确定时区。例如,CST 可以表示中部标准时间、古巴标准时间、中国标准时间等。
(2)DateTime.now().timeZoneOffset
属性给出一个 UTC 偏移量,该偏移量垂直跨越多个时区。仅凭这一点还不足以确定时区。
要确定 tz 时区,请同时使用DateTime.now().timeZoneName
和DateTime.now().timeZoneOffset
属性,并映射到相应的 tz 时区。
下面的示例(可以创建为 Flutter 包):
String timeZone = DateTime.now().timeZoneName.toString();
String timeZoneOffset = DateTime.now().timeZoneOffset.toString();
String tzTimeZoneName = '';
String timeZoneName = '';
if (
(timeZone == 'CST' || timeZone == 'CST ( Central Standard Time )') &&
timeZoneOffset == '-6:00:00.00-0.0'
) {
tzTimeZoneName = 'America/Chicago';
timeZoneName = 'Central Standard Time';
}
这两个页面可用于创建完整映射: https://en.wikipedia.org/wiki/List_of_time_zone_abbreviations https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
注意:此映射技术还可用于将时区缩写转换为全名时区(在非 Window 系统上)。例如,CST,到"中部标准时间"。我还认为Dart团队可以在非Window系统上修补此问题,因为它们同时具有时区缩写和UTC偏移量。♂️
在你的酒吧里添加这个
flutter_native_timezone: ^2.0.0
导入 'package:flutter/services.dart';
void getTimeZone() async{
const MethodChannel channel = MethodChannel('flutter_native_timezone');
final String? localTimezone = await channel.invokeMethod("getLocalTimezone");
print(localTimezone);
}
输出 -> 亚洲/卡拉奇
当您需要检查和限制时区列表时,我会抛弃我的实现示例。也许这会帮助某人。
使用时区套餐:
import 'package:collection/collection.dart';
import 'package:timezone/data/latest.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
enum TimeZone {
kaliningrad('Europe'),
moscow('Europe'),
samara('Europe'),
yekaterinburg('Asia'),
omsk('Asia'),
krasnoyarsk('Asia'),
novosibirsk('Asia'),
irkutsk('Asia'),
chita('Asia'),
vladivostok('Asia'),
magadan('Asia'),
sakhalin('Asia'),
srednekolymsk('Asia'),
anadyr('Asia'),
kamchatka('Asia');
const TimeZone(this.continent);
final String continent;
String get id {
final name = '${this.name[0].toUpperCase()}'
'${this.name.substring(1).toLowerCase()}';
return [continent, name].join('/');
}
}
TimeZone? get timeZone {
try {
tz.initializeTimeZones();
final locations = tz.timeZoneDatabase.locations;
final offset = DateTime.now().timeZoneOffset.inMilliseconds;
final zones = locations.keys.where(
(zone) => locations[zone]?.currentTimeZone.offset == offset,
);
return TimeZone.values.firstWhereOrNull(
(tz) => zones.any((z) => z == tz.id),
);
} catch (e, s) {
return null;
}
}
void main() {
final current = timeZone ?? TimeZone.moscow;
print(current.id);
}
var date = DateTime.now().toIso8601String().split(".")[0];
if(DateTime.now().timeZoneOffset.isNegative){
date += "-";
} else {
date += "+";
}
final timeZoneSplit = DateTime.now().timeZoneOffset.toString().split(":");
var hour = int.parse(timeZoneSplit[0]);
if(hour < 10){
date += "0${timeZoneSplit[0]}";
}
date += ":" + timeZoneSplit[1];
print(date);
这将起作用,这将给出类似2021-07-15T19:28:25+05:30
.这里的5:30是IST。这应该很好。
import 'package:intl/intl.dart';
DateTime startDate = DateTime.now().toLocal();
var date = DateFormat.yMMMd().format(startDate);
也许对某人有用,我正在使用:
String formatDateToStringWithTimeZone(DateTime date) {
var dur = date.timeZoneOffset;
if (dur.isNegative)
return "${DateFormat("y-MM-ddTHH:mm:ss").format(date)}-${dur.inHours.toString().padLeft(2, '0')}:${(dur.inMinutes - (dur.inHours * 60)).toString().padLeft(2, '0')}";
else
return "${DateFormat("y-MM-ddTHH:mm:ss").format(date)}+${dur.inHours.toString().padLeft(2, '0')}:${(dur.inMinutes - (dur.inHours * 60)).toString().padLeft(2, '0')}";
}