Improve support for v8's Date.toString time zone

This commit is contained in:
Sami Samhuri 2021-12-12 10:43:07 -08:00
parent 5a1db7ba03
commit dee584fda4
2 changed files with 40 additions and 5 deletions

View file

@ -13,6 +13,7 @@
var Locales = { var Locales = {
de_DE: { de_DE: {
identifier: 'de-DE',
days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'], days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
shortDays: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], shortDays: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
months: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], months: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
@ -35,6 +36,7 @@
}, },
en_CA: { en_CA: {
identifier: 'en-CA',
days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ], days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ],
shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
@ -63,6 +65,7 @@
}, },
en_US: { en_US: {
identifier: 'en-US',
days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ], days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ],
shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
@ -91,6 +94,7 @@
}, },
es_MX: { es_MX: {
identifier: 'es-MX',
days: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'], days: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],
shortDays: ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'], shortDays: ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'],
months: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre',' diciembre'], months: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre',' diciembre'],
@ -113,6 +117,7 @@
}, },
fr_FR: { fr_FR: {
identifier: 'fr-FR',
days: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'], days: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
shortDays: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'], shortDays: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
months: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'], months: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
@ -135,6 +140,7 @@
}, },
it_IT: { it_IT: {
identifier: 'it-IT',
days: ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'], days: ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'],
shortDays: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'], shortDays: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],
months: ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'], months: ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'],
@ -157,6 +163,7 @@
}, },
nl_NL: { nl_NL: {
identifier: 'nl-NL',
days: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], days: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
shortDays: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], shortDays: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
months: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], months: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
@ -179,6 +186,7 @@
}, },
pt_BR: { pt_BR: {
identifier: 'pt-BR',
days: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'], days: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],
shortDays: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'], shortDays: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'],
months: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'], months: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],
@ -201,6 +209,7 @@
}, },
ru_RU: { ru_RU: {
identifier: 'ru-RU',
days: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'], days: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
shortDays: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'], shortDays: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'], months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
@ -223,6 +232,7 @@
}, },
tr_TR: { tr_TR: {
identifier: 'tr-TR',
days: ['Pazar', 'Pazartesi', 'Salı','Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'], days: ['Pazar', 'Pazartesi', 'Salı','Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],
shortDays: ['Paz', 'Pzt', 'Sal', 'Çrş', 'Prş', 'Cum', 'Cts'], shortDays: ['Paz', 'Pzt', 'Sal', 'Çrş', 'Prş', 'Cum', 'Cts'],
months: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'], months: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],
@ -247,6 +257,7 @@
// By michaeljayt<michaeljayt@gmail.com> // By michaeljayt<michaeljayt@gmail.com>
// https://github.com/michaeljayt/strftime/commit/bcb4c12743811d51e568175aa7bff3fd2a77cef3 // https://github.com/michaeljayt/strftime/commit/bcb4c12743811d51e568175aa7bff3fd2a77cef3
zh_CN: { zh_CN: {
identifier: 'zh-CN',
days: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], days: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
shortDays: ['日', '一', '二', '三', '四', '五', '六'], shortDays: ['日', '一', '二', '三', '四', '五', '六'],
months: ['一月份', '二月份', '三月份', '四月份', '五月份', '六月份', '七月份', '八月份', '九月份', '十月份', '十一月份', '十二月份'], months: ['一月份', '二月份', '三月份', '四月份', '五月份', '六月份', '七月份', '八月份', '九月份', '十月份', '十一月份', '十二月份'],
@ -499,9 +510,8 @@
resultString += "GMT"; resultString += "GMT";
} }
else { else {
// fixme optimize var tzName = getTimezoneName(date);
var tzString = date.toString().match(/\(([\w\s]+)\)/); resultString += tzName || '';
resultString += tzString && tzString[1] || '';
} }
break; break;
@ -809,6 +819,31 @@
return (date.getTimezoneOffset() || 0) * 60000; return (date.getTimezoneOffset() || 0) * 60000;
} }
// Tries to get a short timezone name using Date.toLocaleString, falling back on the platform default
// using Date.toString if necessary.
function getTimezoneName(date, localeIdentifier) {
return getShortTimezoneName(date, localeIdentifier) || getDefaultTimezoneName(date);
}
// Unfortunately this returns GMT+2 when running with `TZ=Europe/Amsterdam node test.js` so it's not
// perfect.
function getShortTimezoneName(date, localeIdentifier) {
if (localeIdentifier == null) return null;
var tzString = date
.toLocaleString(localeIdentifier, { timeZoneName: 'short' })
.match(/\s([\w]+)$/);
return tzString && tzString[1];
}
// This varies by platform so it's not an ideal way to get the time zone name. On most platforms it's
// a short name but in Node v10+ and Chrome 66+ it's a long name now. Prefer getShortTimezoneName(date)
// where possible.
function getDefaultTimezoneName(date) {
var tzString = date.toString().match(/\(([\w\s]+)\)/);
return tzString && tzString[1];
}
function warn(message) { function warn(message) {
if (typeof console !== 'undefined' && typeof console.warn == 'function') { if (typeof console !== 'undefined' && typeof console.warn == 'function') {
console.warn(message) console.warn(message)

View file

@ -38,7 +38,7 @@ if (process.env.TZ == 'America/Vancouver') {
testTimezone('America/Vancouver'); testTimezone('America/Vancouver');
assert.format('%C', '01', '01', new Date(100, 0, 1)); assert.format('%C', '01', '01', new Date(100, 0, 1));
assert.format('%X', '11:51:45 AM', '06:51:45 PM'); assert.format('%X', '11:51:45 AM', '06:51:45 PM');
assert.format('%c', 'Tue 07 Jun 2011 11:51:45 AM PDT', 'Tue 07 Jun 2011 06:51:45 PM GMT'); assert.format('%c', 'Tue 07 Jun 2011 11:51:45 AM Pacific Daylight Time', 'Tue 07 Jun 2011 06:51:45 PM GMT');
assert.format('%j', '097', '098', new Date(1365390736236)); assert.format('%j', '097', '098', new Date(1365390736236));
assert.format('%x', '06/07/11'); assert.format('%x', '06/07/11');
assert.format('%U', '12', null, new Date('2017-03-25 00:00:00 +0000')); assert.format('%U', '12', null, new Date('2017-03-25 00:00:00 +0000'));
@ -57,7 +57,7 @@ else if (process.env.TZ == 'Europe/Amsterdam') {
testTimezone('Europe/Amsterdam'); testTimezone('Europe/Amsterdam');
assert.format('%C', '01', '00', new Date(100, 0, 1)); assert.format('%C', '01', '00', new Date(100, 0, 1));
assert.format('%X', '08:51:45 PM', '06:51:45 PM'); assert.format('%X', '08:51:45 PM', '06:51:45 PM');
assert.format('%c', 'Tue 07 Jun 2011 08:51:45 PM CEST', 'Tue 07 Jun 2011 06:51:45 PM GMT'); assert.format('%c', 'Tue 07 Jun 2011 08:51:45 PM Central European Summer Time', 'Tue 07 Jun 2011 06:51:45 PM GMT');
assert.format('%j', '098', '098', new Date(1365390736236)); assert.format('%j', '098', '098', new Date(1365390736236));
assert.format('%x', '06/07/11'); assert.format('%x', '06/07/11');
assert.format('%U', '12', null, new Date('2017-03-25 00:00:00 +0000')); assert.format('%U', '12', null, new Date('2017-03-25 00:00:00 +0000'));