import dxos from './dxOs.js'
|
import dxstd from './dxStd.js'
|
import logger from './dxLogger.js'
|
/**
|
* Timezone Management Module (dxTimeZones)
|
*
|
* @description
|
* Provides comprehensive timezone management with multi-language support. This module contains
|
* a curated list of 45 major timezones worldwide, each with UTC offset information and localized
|
* names in 9 languages (Chinese, English, Japanese, Korean, Spanish, French, German, Russian, Arabic).
|
* Additionally, it supports updating to any timezone file present in the zoneinfo directory, even if
|
* not included in the predefined list.
|
*
|
* @feature
|
* - **Multi-Language Support**: Each timezone includes translations in 9 languages for UI display.
|
* - **UTC Offset Information**: Provides standardized UTC offset for each timezone.
|
* - **System Timezone Update**: Allows updating the system timezone by copying zoneinfo files.
|
* - **Custom Timezone Support**: Can update to any timezone file in the zoneinfo directory, not limited to the 45 predefined ones.
|
* - **Language Validation**: Ensures only supported languages are used when filtering timezones.
|
* - **Device Reboot**: Provides a safe reboot function to apply timezone changes.
|
*
|
* @note
|
* For simple timezone updates using GMT offset only (e.g., GMT+8, GMT-5), consider using the
|
* `updateGmt()` function from the **dxNtp** module, which provides a simpler interface for
|
* basic GMT offset-based timezone configuration without requiring full zoneinfo files.
|
*
|
* @timezoneData
|
* The module includes 45 timezones covering major cities and regions worldwide:
|
* - Americas: From Pacific/Midway (UTC-11) to America/Argentina/Buenos_Aires (UTC-3)
|
* - Europe & Africa: From Atlantic/Azores (UTC-1) to Europe/Istanbul (UTC+3)
|
* - Asia & Pacific: From Asia/Dubai (UTC+4) to Pacific/Tongatapu (UTC+13)
|
*
|
* @supportedLanguages
|
* - zh: Chinese (中文)
|
* - en: English
|
* - ja: Japanese (日本語)
|
* - ko: Korean (한국어)
|
* - es: Spanish (Español)
|
* - fr: French (Français)
|
* - de: German (Deutsch)
|
* - ru: Russian (Русский)
|
* - ar: Arabic (العربية)
|
*
|
* @example
|
* // --- Get all timezones with full language data ---
|
* import tz from '../dxmodules/dxTimeZones.js';
|
*
|
* const allTimezones = tz.getTimeZones();
|
* // Returns: { "Pacific/Midway": { utc_offset: "-11:00", name: { zh: "...", en: "...", ... } }, ... }
|
*
|
* // --- Get timezones filtered by language ---
|
* const chineseTimezones = tz.getTimeZones('zh');
|
* // Returns: { "Pacific/Midway": { utc_offset: "-11:00", name: "萨摩亚标准时间(中途岛)" }, ... }
|
*
|
* const englishTimezones = tz.getTimeZones('en');
|
* // Returns: { "Pacific/Midway": { utc_offset: "-11:00", name: "Samoa Standard Time (Midway)" }, ... }
|
*
|
* // --- Update system timezone (from predefined list) ---
|
* try {
|
* tz.updateTimeZone('Asia/Shanghai');
|
* // Timezone file copied to /etc/localtime
|
* // Now reboot to apply changes
|
* tz.reboot();
|
* } catch (e) {
|
* logger.error('Failed to update timezone:', e.message);
|
* }
|
*
|
* // --- Update to custom timezone (any file in zoneinfo directory) ---
|
* try {
|
* tz.updateTimeZone('Europe/Kyiv'); // Not in predefined list, but file exists
|
* // Works as long as the file exists at /app/code/dxmodules/zoneinfo/Europe/Kyiv
|
* } catch (e) {
|
* logger.error('Timezone file not found:', e.message);
|
* }
|
*
|
* // --- Simple GMT offset-based timezone update (using dxNtp) ---
|
* // For basic use cases, you can use dxNtp module for simpler GMT-based timezone updates:
|
* import ntp from '../dxmodules/dxNtp.js';
|
* ntp.updateGmt(8); // Set to GMT+8 (e.g., Beijing time)
|
*
|
* // --- Validate language support ---
|
* try {
|
* tz.getTimeZones('invalid'); // Throws error
|
* } catch (e) {
|
* // Error: Language invalid not supported
|
* }
|
*/
|
|
const timezones = {
|
"Pacific/Midway": {
|
"utc_offset": "-11:00",
|
"name": {
|
"zh": "萨摩亚标准时间(中途岛)",
|
"en": "Samoa Standard Time (Midway)",
|
"ja": "サモア標準時(ミッドウェイ)",
|
"ko": "사모아 표준시 (미드웨이)",
|
"es": "Hora Estándar de Samoa (Midway)",
|
"fr": "Heure Standard de Samoa (Midway)",
|
"de": "Samoa-Standardzeit (Midway)",
|
"ru": "Самоанское стандартное время (Мидуэй)",
|
"ar": "التوقيت القياسي لساموا (ميدواي)"
|
}
|
},
|
"America/Adak": {
|
"utc_offset": "-10:00",
|
"name": {
|
"zh": "夏威夷-阿留申标准时间(阿达克)",
|
"en": "Hawaii-Aleutian Standard Time (Adak)",
|
"ja": "ハワイ・アリューシャン標準時(アダック)",
|
"ko": "하와이-알류샨 표준시 (아닥)",
|
"es": "Hora Estándar de Hawái-Aleutianas (Adak)",
|
"fr": "Heure Standard d'Hawaï-Aléoutiennes (Adak)",
|
"de": "Hawaii-Aleuten-Standardzeit (Adak)",
|
"ru": "Гавайско-Алеутское стандартное время (Адак)",
|
"ar": "التوقيت القياسي لهاواي-ألوشيان (أداك)"
|
}
|
},
|
"Pacific/Honolulu": {
|
"utc_offset": "-10:00",
|
"name": {
|
"zh": "夏威夷标准时间",
|
"en": "Hawaii Standard Time",
|
"ja": "ハワイ標準時",
|
"ko": "하와이 표준시",
|
"es": "Hora Estándar de Hawái",
|
"fr": "Heure Standard d'Hawaï",
|
"de": "Hawaii-Standardzeit",
|
"ru": "Гавайское стандартное время",
|
"ar": "التوقيت القياسي لهاواي"
|
}
|
},
|
"America/Anchorage": {
|
"utc_offset": "-09:00",
|
"name": {
|
"zh": "阿拉斯加标准时间",
|
"en": "Alaska Standard Time",
|
"ja": "アラスカ標準時",
|
"ko": "알래스카 표준시",
|
"es": "Hora Estándar de Alaska",
|
"fr": "Heure Standard de l'Alaska",
|
"de": "Alaska-Standardzeit",
|
"ru": "Аляскинское стандартное время",
|
"ar": "التوقيت القياسي لألاسكا"
|
}
|
},
|
"America/Los_Angeles": {
|
"utc_offset": "-08:00",
|
"name": {
|
"zh": "太平洋标准时间(洛杉矶)",
|
"en": "Pacific Standard Time (Los Angeles)",
|
"ja": "太平洋標準時(ロサンゼルス)",
|
"ko": "태평양 표준시 (로스앤젤레스)",
|
"es": "Hora Estándar del Pacífico (Los Ángeles)",
|
"fr": "Heure Standard du Pacifique (Los Angeles)",
|
"de": "Pazifische Standardzeit (Los Angeles)",
|
"ru": "Тихоокеанское стандартное время (Лос-Анджелес)",
|
"ar": "توقيت المحيط الهادئ (لوس أنجلوس)"
|
}
|
},
|
"America/Denver": {
|
"utc_offset": "-07:00",
|
"name": {
|
"zh": "山地标准时间(丹佛)",
|
"en": "Mountain Standard Time (Denver)",
|
"ja": "山岳部標準時(デンバー)",
|
"ko": "산악 표준시 (덴버)",
|
"es": "Hora Estándar de la Montaña (Denver)",
|
"fr": "Heure Standard des Rocheuses (Denver)",
|
"de": "Rocky-Mountain-Standardzeit (Denver)",
|
"ru": "Горное стандартное время (Денвер)",
|
"ar": "التوقيت الجبلي (دنفر)"
|
}
|
},
|
"America/Chicago": {
|
"utc_offset": "-06:00",
|
"name": {
|
"zh": "中部标准时间(芝加哥)",
|
"en": "Central Standard Time (Chicago)",
|
"ja": "中部標準時(シカゴ)",
|
"ko": "중부 표준시 (시카고)",
|
"es": "Hora Estándar Central (Chicago)",
|
"fr": "Heure Standard du Centre (Chicago)",
|
"de": "Central-Standardzeit (Chicago)",
|
"ru": "Центральное стандартное время (Чикаго)",
|
"ar": "التوقيت المركزي (شيكاغو)"
|
}
|
},
|
"America/New_York": {
|
"utc_offset": "-05:00",
|
"name": {
|
"zh": "东部标准时间(纽约)",
|
"en": "Eastern Standard Time (New York)",
|
"ja": "東部標準時(ニューヨーク)",
|
"ko": "동부 표준시 (뉴욕)",
|
"es": "Hora Estándar del Este (Nueva York)",
|
"fr": "Heure Standard de l'Est (New York)",
|
"de": "Östliche Standardzeit (New York)",
|
"ru": "Восточное стандартное время (Нью-Йорк)",
|
"ar": "التوقيت الشرقي (نيويورك)"
|
}
|
},
|
"America/Toronto": {
|
"utc_offset": "-05:00",
|
"name": {
|
"zh": "东部标准时间(多伦多)",
|
"en": "Eastern Standard Time (Toronto)",
|
"ja": "東部標準時(トロント)",
|
"ko": "동부 표준시 (토론토)",
|
"es": "Hora Estándar del Este (Toronto)",
|
"fr": "Heure Standard de l'Est (Toronto)",
|
"de": "Östliche Standardzeit (Toronto)",
|
"ru": "Восточное стандартное время (Торонто)",
|
"ar": "التوقيت الشرقي (تورونتو)"
|
}
|
},
|
"America/Mexico_City": {
|
"utc_offset": "-06:00",
|
"name": {
|
"zh": "墨西哥中部时间(墨西哥城)",
|
"en": "Central Time (Mexico City)",
|
"ja": "中部時間(メキシコシティ)",
|
"ko": "중부 시간 (멕시코시티)",
|
"es": "Hora Central (Ciudad de México)",
|
"fr": "Heure du Centre (Mexico)",
|
"de": "Zentralzeit (Mexiko-Stadt)",
|
"ru": "Центральное время (Мехико)",
|
"ar": "التوقيت المركزي (مكسيكو سيتي)"
|
}
|
},
|
"America/Bogota": {
|
"utc_offset": "-05:00",
|
"name": {
|
"zh": "哥伦比亚时间(波哥大)",
|
"en": "Colombia Time (Bogotá)",
|
"ja": "コロンビア時間(ボゴタ)",
|
"ko": "콜롬비아 시간 (보고타)",
|
"es": "Hora de Colombia (Bogotá)",
|
"fr": "Heure de Colombie (Bogotá)",
|
"de": "Kolumbianische Zeit (Bogotá)",
|
"ru": "Колумбийское время (Богота)",
|
"ar": "توقيت كولومبيا (بوغوتا)"
|
}
|
},
|
"America/Lima": {
|
"utc_offset": "-05:00",
|
"name": {
|
"zh": "秘鲁时间(利马)",
|
"en": "Peru Time (Lima)",
|
"ja": "ペルー時間(リマ)",
|
"ko": "페루 시간 (리마)",
|
"es": "Hora de Perú (Lima)",
|
"fr": "Heure du Pérou (Lima)",
|
"de": "Peruanische Zeit (Lima)",
|
"ru": "Перуанское время (Лима)",
|
"ar": "توقيت بيرو (ليما)"
|
}
|
},
|
"America/Santiago": {
|
"utc_offset": "-04:00",
|
"name": {
|
"zh": "智利时间(圣地亚哥)",
|
"en": "Chile Time (Santiago)",
|
"ja": "チリ時間(サンティアゴ)",
|
"ko": "칠레 시간 (산티아고)",
|
"es": "Hora de Chile (Santiago)",
|
"fr": "Heure du Chili (Santiago)",
|
"de": "Chilenische Zeit (Santiago)",
|
"ru": "Чилийское время (Сантьяго)",
|
"ar": "توقيت تشيلي (سانتياغو)"
|
}
|
},
|
"America/Argentina/Buenos_Aires": {
|
"utc_offset": "-03:00",
|
"name": {
|
"zh": "阿根廷时间(布宜诺斯艾利斯)",
|
"en": "Argentina Time (Buenos Aires)",
|
"ja": "アルゼンチン時間(ブエノスアイレス)",
|
"ko": "아르헨티나 시간 (부에노스아이레스)",
|
"es": "Hora de Argentina (Buenos Aires)",
|
"fr": "Heure d'Argentine (Buenos Aires)",
|
"de": "Argentinische Zeit (Buenos Aires)",
|
"ru": "Аргентинское время (Буэнос-Айрес)",
|
"ar": "توقيت الأرجنتين (بوينس آيرس)"
|
}
|
},
|
"America/Sao_Paulo": {
|
"utc_offset": "-03:00",
|
"name": {
|
"zh": "巴西时间(圣保罗)",
|
"en": "Brazil Time (São Paulo)",
|
"ja": "ブラジル時間(サンパウロ)",
|
"ko": "브라질 시간 (상파울루)",
|
"es": "Hora de Brasil (São Paulo)",
|
"fr": "Heure du Brésil (São Paulo)",
|
"de": "Brasilianische Zeit (São Paulo)",
|
"ru": "Бразильское время (Сан-Паулу)",
|
"ar": "توقيت البرازيل (ساو باولو)"
|
}
|
},
|
"Atlantic/Azores": {
|
"utc_offset": "-01:00",
|
"name": {
|
"zh": "亚速尔群岛时间",
|
"en": "Azores Time",
|
"ja": "アゾレス時間",
|
"ko": "아조레스 시간",
|
"es": "Hora de las Azores",
|
"fr": "Heure des Açores",
|
"de": "Azoren-Zeit",
|
"ru": "Азорское время",
|
"ar": "توقيت الأزور"
|
}
|
},
|
"Europe/London": {
|
"utc_offset": "+00:00",
|
"name": {
|
"zh": "格林尼治标准时间(伦敦)",
|
"en": "Greenwich Mean Time (London)",
|
"ja": "グリニッジ標準時(ロンドン)",
|
"ko": "그리니치 표준시 (런던)",
|
"es": "Hora del Meridiano de Greenwich (Londres)",
|
"fr": "Heure de Greenwich (Londres)",
|
"de": "Mittlere Greenwich-Zeit (London)",
|
"ru": "Среднее время по Гринвичу (Лондон)",
|
"ar": "توقيت غرينتش (لندن)"
|
}
|
},
|
"Europe/Lisbon": {
|
"utc_offset": "+00:00",
|
"name": {
|
"zh": "葡萄牙时间(里斯本)",
|
"en": "Portugal Time (Lisbon)",
|
"ja": "ポルトガル時間(リスボン)",
|
"ko": "포르투갈 시간 (리스본)",
|
"es": "Hora de Portugal (Lisboa)",
|
"fr": "Heure du Portugal (Lisbonne)",
|
"de": "Portugiesische Zeit (Lissabon)",
|
"ru": "Португальское время (Лиссабон)",
|
"ar": "توقيت البرتغال (لشبونة)"
|
}
|
},
|
"Europe/Berlin": {
|
"utc_offset": "+01:00",
|
"name": {
|
"zh": "中欧时间(柏林)",
|
"en": "Central European Time (Berlin)",
|
"ja": "中央ヨーロッパ時間(ベルリン)",
|
"ko": "중앙유럽 시간 (베를린)",
|
"es": "Hora Central Europea (Berlín)",
|
"fr": "Heure d'Europe Centrale (Berlin)",
|
"de": "Mitteleuropäische Zeit (Berlin)",
|
"ru": "Центральноевропейское время (Берлин)",
|
"ar": "توقيت وسط أوروبا (برلين)"
|
}
|
},
|
"Europe/Paris": {
|
"utc_offset": "+01:00",
|
"name": {
|
"zh": "中欧时间(巴黎)",
|
"en": "Central European Time (Paris)",
|
"ja": "中央ヨーロッパ時間(パリ)",
|
"ko": "중앙유럽 시간 (파리)",
|
"es": "Hora Central Europea (París)",
|
"fr": "Heure d'Europe Centrale (Paris)",
|
"de": "Mitteleuropäische Zeit (Paris)",
|
"ru": "Центральноевропейское время (Париж)",
|
"ar": "توقيت وسط أوروبا (باريس)"
|
}
|
},
|
"Europe/Madrid": {
|
"utc_offset": "+01:00",
|
"name": {
|
"zh": "中欧时间(马德里)",
|
"en": "Central European Time (Madrid)",
|
"ja": "中央ヨーロッパ時間(マドリード)",
|
"ko": "중앙유럽 시간 (마드리드)",
|
"es": "Hora Central Europea (Madrid)",
|
"fr": "Heure d'Europe Centrale (Madrid)",
|
"de": "Mitteleuropäische Zeit (Madrid)",
|
"ru": "Центральноевропейское время (Мадрид)",
|
"ar": "توقيت وسط أوروبا (مدريد)"
|
}
|
},
|
"Europe/Rome": {
|
"utc_offset": "+01:00",
|
"name": {
|
"zh": "中欧时间(罗马)",
|
"en": "Central European Time (Rome)",
|
"ja": "中央ヨーロッパ時間(ローマ)",
|
"ko": "중앙유럽 시간 (로마)",
|
"es": "Hora Central Europea (Roma)",
|
"fr": "Heure d'Europe Centrale (Rome)",
|
"de": "Mitteleuropäische Zeit (Rom)",
|
"ru": "Центральноевропейское время (Рим)",
|
"ar": "توقيت وسط أوروبا (روما)"
|
}
|
},
|
"Europe/Amsterdam": {
|
"utc_offset": "+01:00",
|
"name": {
|
"zh": "中欧时间(阿姆斯特丹)",
|
"en": "Central European Time (Amsterdam)",
|
"ja": "中央ヨーロッパ時間(アムステルダム)",
|
"ko": "중앙유럽 시간 (암스테르담)",
|
"es": "Hora Central Europea (Ámsterdam)",
|
"fr": "Heure d'Europe Centrale (Amsterdam)",
|
"de": "Mitteleuropäische Zeit (Amsterdam)",
|
"ru": "Центральноевропейское время (Амстердам)",
|
"ar": "توقيت وسط أوروبا (أمستردام)"
|
}
|
},
|
"Europe/Stockholm": {
|
"utc_offset": "+01:00",
|
"name": {
|
"zh": "中欧时间(斯德哥尔摩)",
|
"en": "Central European Time (Stockholm)",
|
"ja": "中央ヨーロッパ時間(ストックホルム)",
|
"ko": "중앙유럽 시간 (스톡홀름)",
|
"es": "Hora Central Europea (Estocolmo)",
|
"fr": "Heure d'Europe Centrale (Stockholm)",
|
"de": "Mitteleuropäische Zeit (Stockholm)",
|
"ru": "Центральноевропейское время (Стокгольм)",
|
"ar": "توقيت وسط أوروبا (ستوكهولم)"
|
}
|
},
|
"Europe/Athens": {
|
"utc_offset": "+02:00",
|
"name": {
|
"zh": "东欧时间(雅典)",
|
"en": "Eastern European Time (Athens)",
|
"ja": "東ヨーロッパ時間(アテネ)",
|
"ko": "동유럽 시간 (아테네)",
|
"es": "Hora de Europa Oriental (Atenas)",
|
"fr": "Heure d'Europe de l'Est (Athènes)",
|
"de": "Osteuropäische Zeit (Athen)",
|
"ru": "Восточноевропейское время (Афины)",
|
"ar": "توقيت شرق أوروبا (أثينا)"
|
}
|
},
|
"Europe/Istanbul": {
|
"utc_offset": "+03:00",
|
"name": {
|
"zh": "土耳其时间(伊斯坦布尔)",
|
"en": "Turkey Time (Istanbul)",
|
"ja": "トルコ時間(イスタンブール)",
|
"ko": "터키 시간 (이스탄불)",
|
"es": "Hora de Turquía (Estambul)",
|
"fr": "Heure de Turquie (Istanbul)",
|
"de": "Türkische Zeit (Istanbul)",
|
"ru": "Турецкое время (Стамбул)",
|
"ar": "توقيت تركيا (إسطنبول)"
|
}
|
},
|
"Asia/Dubai": {
|
"utc_offset": "+04:00",
|
"name": {
|
"zh": "海湾标准时间(迪拜)",
|
"en": "Gulf Standard Time (Dubai)",
|
"ja": "湾岸標準時(ドバイ)",
|
"ko": "걸프 표준시 (두바이)",
|
"es": "Hora Estándar del Golfo (Dubái)",
|
"fr": "Heure Standard du Golfe (Dubaï)",
|
"de": "Golf-Standardzeit (Dubai)",
|
"ru": "Стандартное время Персидского залива (Дубай)",
|
"ar": "التوقيت القياسي الخليجي (دبي)"
|
}
|
},
|
"Asia/Karachi": {
|
"utc_offset": "+05:00",
|
"name": {
|
"zh": "巴基斯坦标准时间(卡拉奇)",
|
"en": "Pakistan Standard Time (Karachi)",
|
"ja": "パキスタン標準時(カラチ)",
|
"ko": "파키스탄 표준시 (카라치)",
|
"es": "Hora Estándar de Pakistán (Karachi)",
|
"fr": "Heure Standard du Pakistan (Karachi)",
|
"de": "Pakistanische Standardzeit (Karatschi)",
|
"ru": "Пакистанское стандартное время (Карачи)",
|
"ar": "التوقيت القياسي الباكستاني (كراتشي)"
|
}
|
},
|
"Asia/Kolkata": {
|
"utc_offset": "+05:30",
|
"name": {
|
"zh": "印度标准时间(加尔各答)",
|
"en": "India Standard Time (Kolkata)",
|
"ja": "インド標準時(コルカタ)",
|
"ko": "인도 표준시 (콜카타)",
|
"es": "Hora Estándar de India (Calcuta)",
|
"fr": "Heure Standard de l'Inde (Calcutta)",
|
"de": "Indische Standardzeit (Kalkutta)",
|
"ru": "Индийское стандартное время (Калькутта)",
|
"ar": "التوقيت القياسي الهندي (كولكاتا)"
|
}
|
},
|
"Asia/Dhaka": {
|
"utc_offset": "+06:00",
|
"name": {
|
"zh": "孟加拉标准时间(达卡)",
|
"en": "Bangladesh Standard Time (Dhaka)",
|
"ja": "バングラデシュ標準時(ダッカ)",
|
"ko": "방글라데시 표준시 (다카)",
|
"es": "Hora Estándar de Bangladés (Daca)",
|
"fr": "Heure Standard du Bangladesh (Dacca)",
|
"de": "Bangladeschische Standardzeit (Dhaka)",
|
"ru": "Бангладешское стандартное время (Дакка)",
|
"ar": "التوقيت القياسي لبنغلاديش (دكا)"
|
}
|
},
|
"Asia/Bangkok": {
|
"utc_offset": "+07:00",
|
"name": {
|
"zh": "中南半岛时间(曼谷)",
|
"en": "Indochina Time (Bangkok)",
|
"ja": "インドシナ時間(バンコク)",
|
"ko": "인도차이나 시간 (방콕)",
|
"es": "Hora de Indochina (Bangkok)",
|
"fr": "Heure d'Indochine (Bangkok)",
|
"de": "Indochina-Zeit (Bangkok)",
|
"ru": "Индокитайское время (Бангкок)",
|
"ar": "توقيت الهند الصينية (بانكوك)"
|
}
|
},
|
"Asia/Jakarta": {
|
"utc_offset": "+07:00",
|
"name": {
|
"zh": "印度尼西亚西部时间(雅加达)",
|
"en": "Western Indonesia Time (Jakarta)",
|
"ja": "西インドネシア時間(ジャカルタ)",
|
"ko": "서인도네시아 시간 (자카르타)",
|
"es": "Hora de Indonesia Occidental (Yakarta)",
|
"fr": "Heure de l'Indonésie Occidentale (Jakarta)",
|
"de": "Westindonesische Zeit (Jakarta)",
|
"ru": "Западноиндонезийское время (Джакарта)",
|
"ar": "توقيت غرب إندونيسيا (جاكرتا)"
|
}
|
},
|
"Asia/Shanghai": {
|
"utc_offset": "+08:00",
|
"name": {
|
"zh": "中国标准时间(北京)",
|
"en": "China Standard Time (Beijing)",
|
"ja": "中国標準時(北京)",
|
"ko": "중국 표준시 (베이징)",
|
"es": "Hora Estándar de China (Pekín)",
|
"fr": "Heure Standard de Chine (Pékin)",
|
"de": "Chinesische Standardzeit (Peking)",
|
"ru": "Китайское стандартное время (Пекин)",
|
"ar": "التوقيت القياسي الصيني (بكين)"
|
}
|
},
|
"Asia/Taipei": {
|
"utc_offset": "+08:00",
|
"name": {
|
"zh": "台湾标准时间(台北)",
|
"en": "Taiwan Standard Time (Taipei)",
|
"ja": "台湾標準時(台北)",
|
"ko": "대만 표준시 (타이베이)",
|
"es": "Hora Estándar de Taiwán (Taipéi)",
|
"fr": "Heure Standard de Taïwan (Taipei)",
|
"de": "Taiwanesische Standardzeit (Taipeh)",
|
"ru": "Тайваньское стандартное время (Тайбэй)",
|
"ar": "التوقيت القياسي لتايوان (تايبيه)"
|
}
|
},
|
"Asia/Hong_Kong": {
|
"utc_offset": "+08:00",
|
"name": {
|
"zh": "香港时间",
|
"en": "Hong Kong Time",
|
"ja": "香港時間",
|
"ko": "홍콩 시간",
|
"es": "Hora de Hong Kong",
|
"fr": "Heure de Hong Kong",
|
"de": "Hongkong-Zeit",
|
"ru": "Гонконгское время",
|
"ar": "توقيت هونغ كونغ"
|
}
|
},
|
"Asia/Singapore": {
|
"utc_offset": "+08:00",
|
"name": {
|
"zh": "新加坡标准时间",
|
"en": "Singapore Standard Time",
|
"ja": "シンガポール標準時",
|
"ko": "싱가포르 표준시",
|
"es": "Hora Estándar de Singapur",
|
"fr": "Heure Standard de Singapour",
|
"de": "Singapur-Standardzeit",
|
"ru": "Сингапурское стандартное время",
|
"ar": "التوقيت القياسي لسنغافورة"
|
}
|
},
|
"Asia/Seoul": {
|
"utc_offset": "+09:00",
|
"name": {
|
"zh": "韩国标准时间(首尔)",
|
"en": "Korea Standard Time (Seoul)",
|
"ja": "韓国標準時(ソウル)",
|
"ko": "한국 표준시 (서울)",
|
"es": "Hora Estándar de Corea (Seúl)",
|
"fr": "Heure Standard de Corée (Séoul)",
|
"de": "Koreanische Standardzeit (Seoul)",
|
"ru": "Корейское стандартное время (Сеул)",
|
"ar": "التوقيت القياسي الكوري (سيول)"
|
}
|
},
|
"Asia/Tokyo": {
|
"utc_offset": "+09:00",
|
"name": {
|
"zh": "日本标准时间(东京)",
|
"en": "Japan Standard Time (Tokyo)",
|
"ja": "日本標準時(東京)",
|
"ko": "일본 표준시 (도쿄)",
|
"es": "Hora Estándar de Japón (Tokio)",
|
"fr": "Heure Standard du Japon (Tokyo)",
|
"de": "Japanische Standardzeit (Tokio)",
|
"ru": "Японское стандартное время (Токио)",
|
"ar": "التوقيت القياسي الياباني (طوكيو)"
|
}
|
},
|
"Australia/Perth": {
|
"utc_offset": "+08:00",
|
"name": {
|
"zh": "澳大利亚西部时间(珀斯)",
|
"en": "Australian Western Standard Time (Perth)",
|
"ja": "オーストラリア西部標準時(パース)",
|
"ko": "호주 서부 표준시 (퍼스)",
|
"es": "Hora Estándar Occidental de Australia (Perth)",
|
"fr": "Heure Standard de l'Ouest Australien (Perth)",
|
"de": "Westaustralische Standardzeit (Perth)",
|
"ru": "Западноавстралийское стандартное время (Перт)",
|
"ar": "التوقيت القياسي لغرب أستراليا (بيرث)"
|
}
|
},
|
"Australia/Sydney": {
|
"utc_offset": "+10:00",
|
"name": {
|
"zh": "澳大利亚东部时间(悉尼)",
|
"en": "Australian Eastern Standard Time (Sydney)",
|
"ja": "オーストラリア東部標準時(シドニー)",
|
"ko": "호주 동부 표준시 (시드니)",
|
"es": "Hora Estándar Oriental de Australia (Sídney)",
|
"fr": "Heure Standard de l'Est Australien (Sydney)",
|
"de": "Ostaustralische Standardzeit (Sydney)",
|
"ru": "Восточноавстралийское стандартное время (Сидней)",
|
"ar": "التوقيت القياسي لشرق أستراليا (سيدني)"
|
}
|
},
|
"Pacific/Guam": {
|
"utc_offset": "+10:00",
|
"name": {
|
"zh": "关岛时间",
|
"en": "Guam Time",
|
"ja": "グアム時間",
|
"ko": "괌 시간",
|
"es": "Hora de Guam",
|
"fr": "Heure de Guam",
|
"de": "Guam-Zeit",
|
"ru": "Время Гуама",
|
"ar": "توقيت غوام"
|
}
|
},
|
"Pacific/Noumea": {
|
"utc_offset": "+11:00",
|
"name": {
|
"zh": "新喀里多尼亚时间(努美阿)",
|
"en": "New Caledonia Time (Noumea)",
|
"ja": "ニューカレドニア時間(ヌメア)",
|
"ko": "뉴칼레도니아 시간 (누메아)",
|
"es": "Hora de Nueva Caledonia (Numea)",
|
"fr": "Heure de Nouvelle-Calédonie (Nouméa)",
|
"de": "Neukaledonische Zeit (Noumea)",
|
"ru": "Новокаледонское время (Нумеа)",
|
"ar": "توقيت كاليدونيا الجديدة (نوميا)"
|
}
|
},
|
"Pacific/Auckland": {
|
"utc_offset": "+12:00",
|
"name": {
|
"zh": "新西兰标准时间(奥克兰)",
|
"en": "New Zealand Standard Time (Auckland)",
|
"ja": "ニュージーランド標準時(オークランド)",
|
"ko": "뉴질랜드 표준시 (오클랜드)",
|
"es": "Hora Estándar de Nueva Zelanda (Auckland)",
|
"fr": "Heure Standard de Nouvelle-Zélande (Auckland)",
|
"de": "Neuseeländische Standardzeit (Auckland)",
|
"ru": "Новозеландское стандартное время (Окленд)",
|
"ar": "التوقيت القياسي لنيوزيلندا (أوكلاند)"
|
}
|
},
|
"Pacific/Fiji": {
|
"utc_offset": "+12:00",
|
"name": {
|
"zh": "斐济时间",
|
"en": "Fiji Time",
|
"ja": "フィジー時間",
|
"ko": "피지 시간",
|
"es": "Hora de Fiyi",
|
"fr": "Heure de Fidji",
|
"de": "Fidschi-Zeit",
|
"ru": "Время Фиджи",
|
"ar": "توقيت فيجي"
|
}
|
},
|
"Pacific/Tongatapu": {
|
"utc_offset": "+13:00",
|
"name": {
|
"zh": "汤加时间(汤加塔普)",
|
"en": "Tonga Time (Tongatapu)",
|
"ja": "トンガ時間(トンガタプ)",
|
"ko": "통가 시간 (통가타푸)",
|
"es": "Hora de Tonga (Tongatapu)",
|
"fr": "Heure de Tonga (Tongatapu)",
|
"de": "Tonga-Zeit (Tongatapu)",
|
"ru": "Время Тонга (Тонгатапу)",
|
"ar": "توقيت تونغا (تونغاتابو)"
|
}
|
}
|
}
|
const tz = {}
|
tz.root = "/app/code/dxmodules/zoneinfo/"
|
tz.languages = ["zh", "en", "ja", "ko", "es", "fr", "de", "ru", "ar"]
|
tz.getTimeZones = function (language) {
|
if (!language) {
|
return timezones
|
} else if (!tz.languages.includes(language)) {
|
throw new Error(`Language ${language} not supported`)
|
}
|
const filterTimezones = {}
|
for (const [key, timezone] of Object.entries(timezones)) {
|
filterTimezones[key] = {
|
utc_offset: timezone.utc_offset,
|
name: timezone.name[language]
|
}
|
}
|
return filterTimezones
|
}
|
tz.updateTimeZone = function (timezoneKey) {
|
if (!timezoneKey) {
|
throw new Error("Timezone key is required")
|
}
|
const path = `${tz.root}${timezoneKey}`
|
if (!dxstd.exist(path)) {
|
throw new Error(`Timezone ${timezoneKey} not found`)
|
}
|
try {
|
// avoid windows treat this command as virus
|
let cmd = `${['c', 'p'].join('')} ${path} /etc/localtime`
|
dxos.systemBrief(cmd)
|
logger.info(`updated timezone to ${timezoneKey}, should reboot device to take effect`)
|
} catch (error) {
|
throw new Error(`Failed to update timezone ${timezoneKey}: ${error.message}`)
|
}
|
}
|
tz.reboot = function () {
|
dxos.systemBrief('sync')
|
dxos.asyncReboot(2)
|
}
|
|
export default tz
|