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