SHA256
64 lines
1.7 KiB
Dart
64 lines
1.7 KiB
Dart
part of 'studio_backend_client.dart';
|
|
|
|
String _localTimezoneCode() {
|
|
final now = DateTime.now();
|
|
final timezoneName = now.timeZoneName.trim();
|
|
if (timezoneName.isNotEmpty) {
|
|
final normalizedTimezone = _normalizeTimezone(timezoneName);
|
|
if (normalizedTimezone != timezoneName) {
|
|
return normalizedTimezone;
|
|
}
|
|
}
|
|
|
|
final offset = now.timeZoneOffset;
|
|
if (offset.inHours == 8 && offset.inMinutes.remainder(60) == 0) {
|
|
return 'Asia/Shanghai';
|
|
}
|
|
|
|
final totalMinutes = offset.inMinutes;
|
|
final sign = totalMinutes < 0 ? '-' : '+';
|
|
final absoluteMinutes = totalMinutes.abs();
|
|
final hours = (absoluteMinutes ~/ 60).toString().padLeft(2, '0');
|
|
final minutes = (absoluteMinutes % 60).toString().padLeft(2, '0');
|
|
return '$sign$hours:$minutes';
|
|
}
|
|
|
|
String _normalizeTimezone(String value) {
|
|
final timezone = value.trim();
|
|
if (timezone.isEmpty) {
|
|
return _localTimezoneCode();
|
|
}
|
|
|
|
const windowsTimezoneMap = <String, String>{
|
|
'中国标准时间': 'Asia/Shanghai',
|
|
'China Standard Time': 'Asia/Shanghai',
|
|
'Taipei Standard Time': 'Asia/Taipei',
|
|
'Tokyo Standard Time': 'Asia/Tokyo',
|
|
'Korea Standard Time': 'Asia/Seoul',
|
|
'Singapore Standard Time': 'Asia/Singapore',
|
|
'UTC': 'UTC',
|
|
};
|
|
|
|
final mappedTimezone = windowsTimezoneMap[timezone];
|
|
if (mappedTimezone != null) {
|
|
return mappedTimezone;
|
|
}
|
|
|
|
final asciiTimezone = RegExp(r'^[\x20-\x7E]+$').hasMatch(timezone);
|
|
if (asciiTimezone) {
|
|
return timezone;
|
|
}
|
|
|
|
return 'Asia/Shanghai';
|
|
}
|
|
|
|
String _pick(Map<String, dynamic> map, List<String> keys, String fallback) {
|
|
for (final key in keys) {
|
|
final value = map[key];
|
|
if (value != null && value.toString().isNotEmpty) {
|
|
return value.toString();
|
|
}
|
|
}
|
|
return fallback;
|
|
}
|