Преобразование даты в другой часовой пояс в JavaScript
Я ищу функцию для преобразования даты в одном часовом поясе в другой.
Для этого нужны два параметра,
- Дата (в формате "2012/04/10 10:10:30 +0000")
- строка часового пояса ("Азия / Джакарта")
Строка часового пояса описана в http://en.wikipedia.org/wiki/Zone.tab
Есть ли простой способ сделать это?
18 ответов:
Для момента.JS пользователи, теперь вы можете использоватьmoment-timezone . Используя его, ваша функция будет выглядеть примерно так:
function toTimeZone(time, zone) { var format = 'YYYY/MM/DD HH:mm:ss ZZ'; return moment(time, format).tz(zone).format(format); }
Бесстыдно украдено у: http://www.techrepublic.com/article/convert-the-local-time-to-another-time-zone-with-this-javascript/6016329
/** * function to calculate local time * in a different city * given the city's UTC offset */ function calcTime(city, offset) { // create Date object for current location var d = new Date(); // convert to msec // add local time zone offset // get UTC time in msec var utc = d.getTime() + (d.getTimezoneOffset() * 60000); // create new Date object for different city // using supplied offset var nd = new Date(utc + (3600000*offset)); // return time as a string return "The local time in " + city + " is " + nd.toLocaleString(); }Эта функция полезна для вычисления значения часового пояса, предоставляя название города / страны и значение смещения
Большинство настольных (не мобильных) браузеров, за исключением Safari, поддерживают функциюtoLocaleString с аргументами, более старые браузеры обычно игнорируют аргументы.
new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
Ладно, нашел!
Я использую часовой пояс-js. это код:
var dt = new timezoneJS.Date("2012/04/10 10:10:30 +0000", 'Europe/London'); dt.setTimezone("Asia/Jakarta"); console.debug(dt); //return formatted date-time in asia/jakarta
Понял !
Хотел принудительно указать дату = дата сервера, без маттера локальных настроек (UTC).
Мой сервер GMT-6 --> new Date ().getTimezoneOffset () = 360.
myTZO = 360; myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO))); alert(myNewDate);
Если вам просто нужно преобразовать часовые пояса, я загрузил урезанную версию из moment-timezone с голой минимальной функциональностью. Его ~1KB + данные:
S.loadData({ "zones": [ "Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6", "Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5", ], "links": [ "Europe/Paris|Europe/Madrid", ] }); let d = new Date(); console.log(S.tz(d, "Europe/Madrid").toLocaleString()); console.log(S.tz(d, "Australia/Sydney").toLocaleString());
Задайте переменную с годом, месяцем и днем, разделенными символами' -', плюс 'T' и временем в шаблоне HH:mm:ss, за которым следует +01:00 в конце строки (в моем случае часовой пояс равен +1). Затем используйте эту строку в качестве аргумента для конструктора даты.
//desired format: 2001-02-04T08:16:32+01:00 dateAndTime = year+"-"+month+"-"+day+"T"+hour+":"+minutes+":00+01:00"; var date = new Date(dateAndTime );
Вы можете использовать метод to toLocaleString () для установки часового пояса.
new Date().toLocaleString('en-US', { timeZone: 'Indian/Christmas' })Для Индии вы можете использовать "индийский / Рождество", и ниже приведены различные часовые пояса,
"Antarctica/Davis", "Asia/Bangkok", "Asia/Hovd", "Asia/Jakarta", "Asia/Phnom_Penh", "Asia/Pontianak", "Asia/Saigon", "Asia/Vientiane", "Etc/GMT-7", "Indian/Christmas"
Вы можете попробовать это также для преобразования даты часового пояса в Индию:
var indianTimeZoneVal = new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'}); var indainDateObj = new Date(indianTimeZoneVal); indainDateObj.setHours(indainDateObj.getHours() + 5); indainDateObj.setMinutes(indainDateObj.getMinutes() + 30); console.log(indainDateObj);
Я должен отметить, что я ограничен в отношении того, какие внешние библиотеки я могу использовать. момент.js и часовой пояс-js не были для меня вариантом.
Объект даты js, который у меня есть, находится в UTC. Мне нужно было получить дату и время от этой даты в определенном часовом поясе ("Америка/Чикаго" в моем случае).
var currentUtcTime = new Date(); // This is in UTC // Converts the UTC time to a locale specific format, including adjusting for timezone. var currentDateTimeCentralTimeZone = new Date(currentUtcTime.toLocaleString('en-US', { timeZone: 'America/Chicago' })); console.log('currentUtcTime: ' + currentUtcTime.toLocaleDateString()); console.log('currentUtcTime Hour: ' + currentUtcTime.getHours()); console.log('currentUtcTime Minute: ' + currentUtcTime.getMinutes()); console.log('currentDateTimeCentralTimeZone: ' + currentDateTimeCentralTimeZone.toLocaleDateString()); console.log('currentDateTimeCentralTimeZone Hour: ' + currentDateTimeCentralTimeZone.getHours()); console.log('currentDateTimeCentralTimeZone Minute: ' + currentDateTimeCentralTimeZone.getMinutes());UTC в настоящее время на 6 часов опережает "Америку/Чикаго". Вывод:
currentUtcTime: 11/25/2016 currentUtcTime Hour: 16 currentUtcTime Minute: 15 currentDateTimeCentralTimeZone: 11/25/2016 currentDateTimeCentralTimeZone Hour: 10 currentDateTimeCentralTimeZone Minute: 15
Люди, знакомые с пакетом java 8
java.time, илиjoda-time, вероятно, полюбят нового ребенка в блоке: библиотекуjs-joda .Установить
npm install js-joda js-joda-timezone --saveПример
<script src="node_modules/js-joda/dist/js-joda.js"></script> <script src="node_modules/js-joda-timezone/dist/js-joda-timezone.js"></script> <script> var dateStr = '2012/04/10 10:10:30 +0000'; JSJoda.use(JSJodaTimezone); var j = JSJoda; // https://js-joda.github.io/js-joda/esdoc/class/src/format/DateTimeFormatter.js~DateTimeFormatter.html#static-method-of-pattern var zonedDateTime = j.ZonedDateTime.parse(dateStr, j.DateTimeFormatter.ofPattern('yyyy/MM/dd HH:mm:ss xx')); var adjustedZonedDateTime = zonedDateTime.withZoneSameInstant(j.ZoneId.of('America/New_York')); console.log(zonedDateTime.toString(), '=>', adjustedZonedDateTime.toString()); // 2012-04-10T10:10:30Z => 2012-04-10T06:10:30-04:00[America/New_York] </script>В истинной природе java это довольно многословный lol. Но, будучи портированной библиотекой java, особенно учитывая, что они портировали 1800'ish тестовые случаи, Он также, вероятно, работает великолепно точно.
Манипуляция Хроно-это трудно. Вот почему многие другие библиотеки глючат в крайних случаях. Момент.js кажется чтобы получить правильные часовые пояса, но другие JS-библиотеки, которые я видел, включая
timezone-js, не кажутся надежными.
Если формат не очень важен, и вы не хотите импортировать какую-то большую библиотеку, вы можете просто использовать Intl.DateTimeFormat для преобразования объектов Date в различные часовые пояса.
const options = { year: '2-digit', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', timeZone: 'Asia/Jakarta', timeZoneName: 'short' }; const formater = new Intl.DateTimeFormat('sv-SE', options) const date = new Date("2012/04/10 10:10:30 +0000") console.log(formater.format(date))Смещения, переход на летнее время и другие различия, измененные в прошлом, будут решены за вас
Вы можете поэкспериментировать с языком, чтобы получить другие литералы.
У меня возникли проблемы с использованием часового пояса момента. Я добавляю этот ответ только для того, чтобы кто-то другой столкнулся с той же проблемой. Итак, у меня есть строка даты
2018-06-14 13:51:00, исходящая из моегоAPI. Я знаю, что это хранится вUTC, но строка не говорит сама за себя.Я сообщаю часовой пояс moment, из какого часового пояса эта дата, делая:
let uTCDatetime = momentTz.tz("2018-06-14 13:51:00", "UTC").format(); // If your datetime is from any other timezone then add that instead of "UTC" // this actually makes the date as : 2018-06-14T13:51:00ZТеперь я хотел бы преобразовать его в определенный часовой пояс, выполнив:
let dateInMyTimeZone = momentTz.tz(uTCDatetime, "Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss"); // now this results into: 2018-06-14 19:21:00, which is the corresponding date in my timezone.
Посмотрев вокруг много, включая ссылки с этой страницы, я нашел эту замечательную статью, используя moment timezone:
Чтобы подытожить его:
Получить часовой пояс пользователя
var tz = moment.tz.guess(); console.info('Timezone: ' + tz);Возвращает, например: часовой пояс: Европа / Лондон
Установите часовой пояс пользователя по умолчанию
moment.tz.setDefault(tz);Установить пользовательский часовой пояс
moment.tz.setDefault('America/Los_Angeles');Преобразование даты / времени в локальный часовой пояс, предполагается, что исходная дата / время находится в UTC
moment.utc('2016-12-25 07:00').tz(tz).format('ddd, Do MMMM YYYY, h:mma');Возвращение: Солнце, 25 декабря 2016 года, 7:00 утра
Преобразование даты / времени в LA Time
moment.utc('2016-12-25 07:00').tz('America/Los_Angeles').format('ddd, Do MMMM YYYY, h:mma');Возвращается: СБ, 24 декабря 2016, 11: 00 вечера
Перевести из лос-анджелесского времени в Лондонское
moment.tz('2016-12-25 07:00', 'America/Los_Angeles').tz('Europe/London').format( 'ddd, Do MMMM YYYY, h:mma' );Возвращается: солнце, 25 декабря 2016, 3:00 вечера
Существует модуль npm под названием " часовые пояса.json' вы можете использовать для этого; он в основном состоит из файла json с объектами, содержащими информацию о переходе на летнее время и смещении,....
Для Азии / Джакарты он мог бы вернуть этот объект:
{ "value": "SE Asia Standard Time", "abbr": "SAST", "offset": 7, "isdst": false, "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta", "utc": [ "Antarctica/Davis", "Asia/Bangkok", "Asia/Hovd", "Asia/Jakarta", "Asia/Phnom_Penh", "Asia/Pontianak", "Asia/Saigon", "Asia/Vientiane", "Etc/GMT-7", "Indian/Christmas" ] }Вы можете найти его здесь:
Https://github.com/dmfilipenko/timezones.json
Https://www.npmjs.com/package/timezones.json
Надеюсь, что это полезно
Смещение часового пояса для вашего текущего часового пояса
date +%s -d '1 Jan 1970'Для моего часового пояса GMT+10 (Австралия) он вернулся -36000
Недавно я сделал это в машинописи:
// fromTimezone example : Europe/Paris, toTimezone example: Europe/London private calcTime( fromTimezone: string, toTimezone: string, dateFromTimezone: Date ): Date { const dateToGetOffset = new Date( 2018, 5, 1, 12 ); const fromTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: fromTimezone, hour12: false } ); const toTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: toTimezone, hour12: false } ); const fromTimeHours: number = parseInt( fromTimeString.substr( 0, 2 ), 10 ); const toTimeHours: number = parseInt( toTimeString.substr( 0, 2 ), 10 ); const offset: number = fromTimeHours - toTimeHours; // convert to msec // add local time zone offset // get UTC time in msec const dateFromTimezoneUTC = Date.UTC( dateFromTimezone.getUTCFullYear(), dateFromTimezone.getUTCMonth(), dateFromTimezone.getUTCDate(), dateFromTimezone.getUTCHours(), dateFromTimezone.getUTCMinutes(), dateFromTimezone.getUTCSeconds(), ); // create new Date object for different city // using supplied offset const dateUTC = new Date( dateFromTimezoneUTC + ( 3600000 * offset ) ); // return time as a string return dateUTC; }Я использую формат "en-UK", потому что он простой. Может быть, "en-US" или что-то еще работает.
Если первый аргумент-это часовой пояс вашей локали, а второй-целевой часовой пояс, то он возвращает объект даты с правильным смещением.
Я не знаю простого метода преобразования объекта даты в любой часовой пояс, но если вы хотите преобразовать его в локальный часовой пояс, вы можете просто преобразовать его с помощью
Date.prototype.getTime()в соответствующее число миллисекунд и обратно.date = new Date('2016-05-24T13:07:20'); date = new Date(date.getTime());Например,
Я читал, что различные функции datetime могут демонстрировать нестандартное поведение в некоторых браузерах, поэтому сначала проверьте это. Я могу подтвердите, что он работает в Chrome.date.getHours()теперь вернется15вместо13, Если вы, как и я, в Австрии (а сейчас лето).
Comments