Преобразование даты в другой часовой пояс в JavaScript



Я ищу функцию для преобразования даты в одном часовом поясе в другой.



Для этого нужны два параметра,




  • Дата (в формате "2012/04/10 10:10:30 +0000")

  • строка часового пояса ("Азия / Джакарта")


Строка часового пояса описана в http://en.wikipedia.org/wiki/Zone.tab



Есть ли простой способ сделать это?

769   18  

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:

Https://www.webniraj.com/2016/11/23/javascript-using-moment-js-to-display-dates-times-in-users-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());

Например, date.getHours() теперь вернется 15 вместо 13, Если вы, как и я, в Австрии (а сейчас лето).

Я читал, что различные функции datetime могут демонстрировать нестандартное поведение в некоторых браузерах, поэтому сначала проверьте это. Я могу подтвердите, что он работает в Chrome.

Comments

    Ничего не найдено.