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

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

Ему нужны два параметра,

  • дата (в формате "2012/04/10 10:10:30 +0000" )
  • строка часового пояса ( "Азия/Джакарта" )

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

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

Ответ 1

var aestTime = new Date().toLocaleString("en-US", {timeZone: "Australia/Brisbane"});
aestTime = new Date(aestTime);
console.log('AEST time: '+aestTime.toLocaleString())

var asiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Shanghai"});
asiaTime = new Date(asiaTime);
console.log('Asia time: '+asiaTime.toLocaleString())

var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
usaTime = new Date(usaTime);
console.log('USA time: '+usaTime.toLocaleString())

var indiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Kolkata"});
indiaTime = new Date(indiaTime);
console.log('India time: '+indiaTime.toLocaleString())

Ответ 2

Для пользователей moment.js вы можете использовать момент-время. Используя его, ваша функция будет выглядеть примерно так:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}

Ответ 3

Украден бесстыдно из: 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 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();
}

эта функция полезна для вычисления значения часового пояса путем указания названия города/страны и значения смещения

Ответ 4

Большинство настольных (не мобильных) браузеров, кроме Safari, поддерживают функцию toLocaleString с аргументами, старые браузеры обычно игнорируют аргументы.

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })

Ответ 5

Хорошо, нашел это!

Я использую timezone-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

Ответ 6

Получил это!

Требуется указать дату, указанную date = дата сервера, не задавайте локальные настройки (UTC).

Мой сервер GMT-6 → новый Date(). getTimezoneOffset() = 360.

myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);

Ответ 7

Если вы не хотите импортировать какую-то большую библиотеку, вы можете просто использовать Intl.DateTimeFormat для преобразования объектов Date в разные часовые пояса.

// Specifying timeZone is what causes the conversion, the rest is just formatting
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 startingDate = new Date("2012/04/10 10:10:30 +0000")

const dateInNewTimezone = formater.format(startingDate) 
console.log(dateInNewTimezone) // 12-04-10 17:10:30 GMT+7

Ответ 8

Если вам просто нужно конвертировать часовые пояса, я загрузил урезанную версию моментного часового пояса с минимальной функциональностью. Его ~ 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());

Ответ 9

Вы можете использовать метод 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"

Ответ 10

Вот мой код, он отлично работает, вы можете попробовать дать ниже демо:

$(document).ready(function() {
   //EST
setInterval( function() {
var estTime = new Date();
 var currentDateTimeCentralTimeZone = new Date(estTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));
var seconds = currentDateTimeCentralTimeZone.getSeconds();
var minutes = currentDateTimeCentralTimeZone.getMinutes();
var hours =  currentDateTimeCentralTimeZone.getHours()+1;//new Date().getHours();
 var am_pm = currentDateTimeCentralTimeZone.getHours() >= 12 ? "PM" : "AM";

if (hours < 10){
     hours = "0" + hours;
}

if (minutes < 10){
     minutes = "0" + minutes;
}
if (seconds < 10){
     seconds = "0" + seconds;
}
    var mid='PM';
    if(hours==0){ //At 00 hours we need to show 12 am
    hours=12;
    }
    else if(hours>12)
    {
    hours=hours%12;
    mid='AM';
    }
    var x3 = hours+':'+minutes+':'+seconds +' '+am_pm
// Add a leading zero to seconds value
$("#sec").html(x3);
},1000);


});
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<p class="date_time"><strong id="sec"></strong></p>
</body>
</html>

Ответ 11

Задайте переменную с годом, месяцем и днем, разделенными символами "-", а также "Т" и временем в шаблоне 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 );

Ответ 12

Я должен отметить, что я ограничен в отношении внешних библиотек, которые я могу использовать. moment.js и timezone-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

Ответ 13

Осмотрев много, включая ссылки с этой страницы, я нашел эту замечательную статью, используя момент часовой пояс:

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 года, 23:00

Преобразование из Лос-Анджелеса в Лондон

moment.tz('2016-12-25 07:00', 'America/Los_Angeles').tz('Europe/London').format( 'ddd, Do MMMM YYYY, h:mma' );

Возврат: Вс, 25 декабря 2016 года, 15:00

Ответ 14

Вы также можете использовать https://www.npmjs.com/package/ctoc_timezone

Он имеет очень простую реализацию и настройку формата.

Изменение формата в toTimeZone:

CtoC.toTimeZone(new Date(),"EST","Do MMM YYYY hh:mm:ss #{EST}");

Выход:

28th Feb 2013 19:00:00 EST

Вы можете изучить несколько функций в документе.

Ответ 15

существует модуль npm, называемый "timezones.json", который вы можете использовать для этого; он в основном состоит из json файла с объектами, содержащими информацию о летней сбережении и смещении,....

для asia/jakarta он сможет вернуть этот объект:

{
  "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

надеюсь, что это полезно

Ответ 16

Вы также можете попробовать это для конвертирования даты и времени в Индию:

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);

Ответ 17

Люди, знакомые с пакетом java.time java 8, или joda-time, вероятно, будут любить нового ребенка на блоке: js-joda library.

устанавливать

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-ые тестовые примеры, она также, вероятно, работает превосходно точно.

Хронологическая манипуляция сложна. Вот почему многие другие библиотеки ошибочны в крайних случаях. Moment.js, похоже, имеет правильные временные интервалы, но другие js-библиотеки, которые я видел, включая timezone-js, не кажутся заслуживающими доверия.

Ответ 18

У меня возникли проблемы с использованием Moment Timezone. Я добавляю этот ответ именно так, если кто-то другой сталкивается с той же проблемой. Поэтому у меня есть строка даты 2018-06-14 13:51:00 исходящая из моего API. Я знаю, что это хранится в UTC но строка не говорит сама за себя.

Я позволяю мгновенному часовому поясу знать, в какой временной зоне эта дата выполняется:

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.

Ответ 19

Смещение часового пояса для вашего текущего часового пояса

date +%s -d '1 Jan 1970'

Для моего часового пояса GMT + 10 (Австралия) он вернулся -36000

Ответ 20

Я недавно сделал это в Typcript:

// 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" или что-то работает.

Если первым аргументом является ваш часовой пояс локали, а seconde - ваш часовой пояс, он возвращает объект Date с правильным смещением.

Ответ 21

строго говоря, "2012/04/10 10:10:30 +0000" - это тот же момент во всем мире. вы можете искать две разные вещи:

  • какое время в Азии/Джакарте в 2012/04/10 10:10:30 +0000?
  • если это 2012/04/10 10:10:30 в Азии/Джакарте, какое глобальное время?

Это отвечает на второй вопрос:

    <script>
        var datestr = "2012/04/10 10:10:30 +0000";
        var timezone = "Asia/Jakarta";

        var reldate = new Date(datestr);
        var absdate = new Date(reldate.toLocaleString('en-US', { timeZone: timezone }));

        document.write(reldate.toISOString()+" : ");
        document.write(absdate.toISOString());
    </script>

2012-04-10T10: 10: 30.000Z: 2012-04-10T15: 10: 30.000Z

reldate показывает вам представление ISO глобального времени.

absdate показывает вам представление ISO того же времени, но в Джакарте

поэтому абсент - это тот же самый момент, что и рестарт.

Ответ 22

// British English uses day-month-year order and 24-hour time without AM/PM
console.log(new Date().toLocaleString('en-GB', {
  timeZone: 'UTC'
}));
// expected output: 20/12/2012, 03:00:00
// Korean uses year-month-day order and 12-hour time with AM/PM
console.log(new Date().toLocaleString('ko-KR', {
  timeZone: 'UTC'
}));
// expected output: 2012. 12. 20. 오전 3:00:00

Ответ 23

Я не знаю простого метода преобразования объекта даты в любой часовой пояс, но если вы хотите преобразовать его в локальный часовой пояс, вы можете просто преобразовать его с Date.prototype.getTime() в соответствующее количество миллисекунд, и обратно.

date = new Date('2016-05-24T13:07:20');
date = new Date(date.getTime());

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

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

Ответ 24

быстрая и грязная ручная смена часов и возврат:

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()