Files
TtxPageAdmin/lib/backend/studio_backend_support.dart
T
2026-05-16 01:10:06 +08:00

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;
}