Вопрос по timezone, javascript – Конвертировать дату в другой часовой пояс в JavaScript

235

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

Нужно два параметра,

date (in format "2012/04/10 10:10:30 +0000") timezone string ("Asia/Jakarta")

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

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

Выключите ваш часовой пояс, используя команду даты unix: date +% s -d '1 Jan 1970'. anthony
Проверьте это такжеstackoverflow.com/questions/16084313/… Amol M Kulkarni
Найти смещение UTC данного города.stackoverflow.com/questions/3002910/… Brandon Boone
возможный дубликатHow to initialize javascript date to a particular timezone Matt Johnson
Я хочу рассчитать не только смещение UTC, но также летнее / летнее время. Так что время вернется правильно. Rizky Ramadhan

Ваш Ответ

21   ответ
1

в Индию:

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);
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
123

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

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededDate.prototype.toLocaleString.
Error: User Rate Limit Exceeded
4

пояса.

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"
Вы не устанавливаете timeZone, а скорее производите строку со временем, выраженным в этой timeZone. Дата остается прежней.
2

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

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

1

называемый «timezones.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

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

2

указав год, месяц и день, разделив их символом «-». символы плюс «T»; и время в формате ЧЧ: мм: сс, за которым следует +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 );
4

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

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

Мой сервер GMT-6 - & gt; new Date (). getTimezoneOffset () = 360.

myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

и вы не хотите импортировать какую-то большую библиотеку, вы можете просто использовать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))

Смещения, переход на летнее время и другие изменения, измененные в прошлом, позаботятся о вас

Вы можете экспериментировать с языком, чтобы получить другие литералы.

IE10 + не поддерживает Intl API для часовых поясов.moment.github.io/luxon/docs/manual/matrix.html
0

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

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

81

кроме Safari, поддерживаютtoLocaleString функция с аргументами, старые браузеры обычно игнорируют аргументы.

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
Сбои в Firefox и Edge :(
работает на хроме
Поскольку это не помогает в FF и IE11 +, необходимо найти другое решение.
Край и хром понравились :)
Он работал только сейчас на Chrome v59 и Firefox Desktop v54 и Chome на Android v59 и Safari 10 на iOS 10.3. Он не работал на IE10.MDN's description of Date.prototype.toLocaleString() имеетtoLocaleStringSupportsLocales() реализация, которая позволяет надежно проверить поддержку.
4

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

$(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>

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededcurrentDateTimeCentralTimeZone.getHours()Error: User Rate Limit Exceededstackoverflow.com/a/40809160/1404185
Error: User Rate Limit Exceeded
84

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Rizky Ramadhan
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

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

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

59

Я используючасовой пояс-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
Error: User Rate Limit Exceededgithub.com/mde/timezone-js/issues/51 и ряд других проблем, которые были поданы и которые, кажется, не решены.
Error: User Rate Limit Exceeded
@ nus да, но на самом деле не существует решения для управления часовыми поясами / датами на стороне клиента ... jquery ui datepicker сводит меня с ума из-за этого. ура
Не используйте TimezoneJS, он прослушивается вокруг изменений летнего времени.
@Marabunta, похоже, момент-часовой пояс (ответ Брайана Ди Пальма) поддерживает DSTgithub.com/moment/moment-timezone/issues/21
1

Момент Часовой пояс, Я добавляю этот ответ просто так, если кто-то еще сталкивается с той же проблемой. Итак, у меня есть строка даты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.
-1

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

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

Например,date.getH,ours() сейчас вернусь15 вместо13 если вы, как и я, находитесь в Австрии (и это лето).

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

что я ограничен в отношении того, какие внешние библиотеки я могу использовать. 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
new Date(); вернуть местный часовой пояс, а не UTC
из документов:If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
Хм. Вроде запутанно. Это не меняет часовой пояс даты; скорее это создает новую дату с измененными часами. Это было быmuchError: User Rate Limit Exceeded
0

date +%s -d '1 Jan 1970'

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

1

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 это довольно многословно, смеется. Но, будучи портированной библиотекой java, особенно учитывая, что они портировали 1800 тестовых случаев, она также, вероятно, работает превосходно точно.

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

18

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

Для "Нью-Йорка" Выходной сигнал, если это применимо, автоматически настраивается на летнее время или вам необходимо выполнить регулировку вручную.
Если кто-то ищет реализацию, которая работает для всех браузеров прямо сейчас, он может попробовать любые ответы ниже с его собственными минусами ... Rizky Ramadhan
Я изменил ответ на это, так как это правильный и стандартный метод без использования какой-либо библиотеки. Rizky Ramadhan
@DanielAllenLangdon извините, но кто-нибудь еще использует IE11? Этот ответ работает и для Chrome. Я знаю, что реализация MDN предназначена для Firefox, но я думаю, что она более ориентирована на будущее, чем любой ответ на этот вопрос. Rizky Ramadhan
В документации MDN четко сказано, что единственный часовой пояс, который требуется распознать во всех реализациях, - это UTC. (stackoverflow.com/questions/10087819/…) Нажатие кнопки [Run code snippet] в IE11 приводит к ошибке.

Похожие вопросы