Конвертировать дату в другой часовой пояс в JavaScript


336

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

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

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

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

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


1
Найти смещение UTC данного города. stackoverflow.com/questions/3002910/…
Брэндон Бун

3
Я хочу рассчитать не только смещение UTC, но и летнее / летнее время. Так что время вернется правильно.
Ризки Рамадан


Проверьте это, а также stackoverflow.com/questions/16084313/…
Amol M Kulkarni

Выключите ваш часовой пояс с помощью команды unix date: date +% s -d '1 Jan 1970'
anthony

Ответы:


192

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

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

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

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

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


1
Я изменил ответ на это, так как это правильный и стандартный метод без использования какой-либо библиотеки.
Ризки Рамадан

5
В документации MDN четко сказано, что единственный часовой пояс, который требуется распознавать во всех реализациях, - это UTC. ( stackoverflow.com/questions/10087819/… ) Нажатие кнопки [Run code snippet] в IE11 приводит к ошибке.
Река Вивиан

1
Если кто-то ищет реализацию, которая работает для всех браузеров прямо сейчас, он может попробовать любые ответы ниже со своими собственными минусами ...
Ризки Рамадан

14
Этот ответ показывает правильную передачу часового пояса в toLocaleString, но затем он очень неправильно показывает передачу этой строки обратно в Dateконструктор. Это напрашивается на неприятности. Синтаксический анализатор строки даты не обязателен для принятия определенных форматов локали, и ввод будет обрабатываться так, как если бы он находился в местном часовом поясе. Не делай этого. Просто используйте строку вывода из первого toLocalStringвызова.
Мэтт Джонсон-

4
@MattJohnson, тогда вы не можете использовать getHour () или такие методы
Али Падида

131

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

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

3
Я не был уверен, как добавить новые часовые пояса, документы не помогли мне. Я просто программист, а не эксперт по времени!
Парзифал

8
Проблема здесь в том, что это не возвращает новый объект Date, а возвращает строку. Если это то, что вы хотите, это хорошо, конечно.
nickdnk

2
Разве это не "момент возврата (время) .tz (зона) .format (формат);" ? Тот, который вы дали в своем коде, содержит ошибку «Неверная дата».
Тарек

1
Невозможно загрузить Moment.js в браузере. Очень грустно :(
Даниил Шевелев

4
Если вас не устраивает отправка 180K в браузер с копией базы данных tz, и вы можете жить с ухудшением текущего часового пояса в старых браузерах, попробуйте ответ @ lambinator, используя Date.prototype.toLocaleString.
Петр В. Мёрч

92

Похищен бесстыдно у: 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();
}

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


4
хорошо ... но я думаю, что он хочет, чтобы смещение было проверено для него на основе переданного в городе.
Брэндон Бун

117
Это не учитывает изменения летнего времени.
Robotbugs

12
не отвечает на вопрос, но отвечает на мой (+1)
Царствование. 85

Это «3600000» буквально убило меня! На входе tz следует указывать в часах! И это должно быть вычтено. Итак, если вы передадите: var d = new Date calcTime ('', d.getTimezoneOffset () / 60); Это должно вернуть в то же время.
Правин

1
Этот ответ серьезно устарел и должен быть удален, особенно часть, использующая toLocaleString , которая, скорее всего, сообщит часовой пояс хоста, когда он будет смещен в другой часовой пояс. Есть гораздо лучшие способы ручного создания временных меток для разных смещений.
RobG

89

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

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

4
Сбои в Firefox и Edge :(
Шиме Видас

10
Поскольку это не помогает в FF и IE11 +, необходимо найти другое решение.
jdavid.net

2
Edge and chrome понравилось :)
Сухайль Мумтаз Аван

6
Он работал только сейчас на Chrome v59 и Firefox Desktop v54 и Chome на Android v59 и Safari 10 на iOS 10.3. Это не сработало на IE10. MDN-описание Date.prototype.toLocaleString () имеет toLocaleStringSupportsLocales()реализацию, которая позволяет вам надежно проверять поддержку.
Петр В. Мёрч

1
Успешно протестировано в node.js v8.7.0
Генрих Ульбрихт

56

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

Я использую часовой пояс-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

90
Я должен голосовать против этого, timezone-js не поддерживает DST, и он не рекламирует это в своем readme, что делает его плохим советом для людей, ищущих это. Смотрите: github.com/mde/timezone-js/issues/51 и ряд других проблем, которые были поданы и которые, похоже, не решаются.

@ nus да, но на самом деле не существует решения для управления часовыми поясами / датами на стороне клиента ... jquery ui datepicker сводит меня с ума из-за этого. ура
Лукас

2
@Marabunta, похоже, момент-часовой пояс (ответ Брайана Ди Пальмы) поддерживает DST github.com/moment/moment-timezone/issues/21
welldan97

2
Не используйте TimezoneJS, это связано с изменениями DST.
Матф

17

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

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


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

Это на самом деле лучший ответ. toLocaleStringимеет противоречивую реализацию, и это работает начиная с IE11.
Dlsso

К вашему сведению: это на самом деле не работает в IE11, по крайней мере, в Windows 8.1. Когда вы пытаетесь создать formatterобъект, вы получаете: `` `Значение параметра 'Азия / Джакарта' для 'timeZone' вне допустимого диапазона. Ожидаемый: ['UTC'] `` `
ведерматический

Есть ли способ снова преобразовать окончательный результат из средства форматирования в объект Date?
mding5692

10

Понял !

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

Мой сервер GMT-6 -> new Date (). GetTimezoneOffset () = 360.

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

2
Хотя это показывает правильное наивное время, информация о часовом поясе от myOldDateObj сохраняется. Так что на самом деле это неправильное время (когда вы берете время как пример во времени, а не время на часах).
gabn88

@ gabn88: Вы не сможете изменить время сервера, используя Javascript ... Чтобы исправить время сервера, сделайте это на уровне операционной системы.
Седрик Саймон

2
Мне не нужно фиксировать время сервера;) Время сервера всегда для меня. Но у меня разная организация в разных часовых поясах. И их устройства всегда должны показывать время, в котором находится их организация, где бы они ни находились.
gabn88

У нас есть похожая проблема показа даты всегда X часового пояса. Мы пытаемся отправить все даты в строковом формате с сервера, и в браузере мы просто рассматриваем их как даты местного часового пояса.
Венкатешвара Рао

5

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

Вы не устанавливаете timeZone, а скорее производите строку со временем, выраженным в этой timeZone. Дата остается прежней.
Джерард ONeill


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

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

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

11
new Date();вернуть местный часовой пояс, а не UTC
Мирко

1
из документов:If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
Мирко

Хм. Вроде запутанно. Это не меняет часовой пояс на дату; скорее это создает новую дату с измененными часами. Было бы намного понятнее использовать регулярное выражение для извлечения желаемых значений из строки, созданной из вызова toLocaleString.
Джерард ONeill

2

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

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


Добро пожаловать в StackOverflow! Можете ли вы предоставить больше информации, например, как этот код работает и что он делает? Как это решает проблему?
DarkSuniuM

Мой приведенный выше код предназначен для обновления вашего часового пояса на часовой пояс других стран.
Сахил Капур

Вам нужно поместить HTML в ваш HTML-файл, и приведенный выше код JQuery должен быть в нижнем колонтитуле. Это будет работать для вас согласно ('en-US', {timeZone: 'America / Chicago'}), вам нужно обновить эти два значения, если вы хотите часовой пояс для других стран. Спасибо
Sahil Kapoor

Нет, подождите. Я просто проголосовал за это, не глядя внимательно. Почему вы добавляете 1 к currentDateTimeCentralTimeZone.getHours()? Без этого он будет работать и будет таким же, как и в ответе на запрос27: stackoverflow.com/a/40809160/1404185
Четверг

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

1
после самого 2-го шага я получаю время в Индии ... так почему вы все еще добавляете 5 & 1/2 часа к нему?
user3833732

Используя этот метод, я получаю следующее здесь, в Норвегии, когда я консольный журнал с Chrome: Оригинал: чт 27 сентября 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Изменено: четверг, 27 сентября 2018 г. 19:23:46 GMT + 0200 (сентралеуропейск соммертид). «Sentraleuropeisk Sommertid» означает летнее время в Центральной Европе. Не уверен, сработает ли это, когда вам нужно летнее время для Индии, или наоборот, когда вы находитесь в Индии и вам нужно летнее время для Европы и так далее.
Кебман

Подобное использование setHours () не учитывает переходы дня, месяца и года, например, в 3:30 утра в New Dell 8-го числа в 23:00 7-го в Лондоне. Затем рассмотрите конец месяца, года и високосных дней. Пусть Date выполняет эту математическую операцию <pre> let local_time = new Date (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor - 60 * 60 * 1000); let date_str = local_time.toISOString (). slice (0, 10); let time_str = local_time.toISOString (). slice (11, -1); let timezone_str = std_timezone.timezone_str; </ pre>
Линкольн Рэндалл МакФарланд

1

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

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

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

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


0

для этого можно использовать модуль npm 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

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


0

Люди, знакомые с java.timeпакетом java 8 , или 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-библиотеки, которые я видел, в том числе timezone-js, не заслуживают доверия.


0

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

// 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 с правильным смещением.


0

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

0

Просто установите желаемый часовой пояс страны, и вы можете легко показать в html его обновление с помощью функции SetInteval () через каждую минуту. Функция formatAMPM () управляет 12-часовым форматом и отображением времени AM / PM.

$(document).ready(function(){
        var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
        pakTime = new Date(pakTime);

        var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
        libyaTime = new Date(libyaTime);



         document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
         document.getElementById("ly").innerHTML = "LY   " +formatAMPM(libyaTime);

        setInterval(function(today) {
            var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
            pakTime = new Date(pakTime);

            var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
            libyaTime = new Date(libyaTime);


           document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
           document.getElementById("ly").innerHTML = "LY  " +formatAMPM(libyaTime);

        },10000);

         function formatAMPM(date) {
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var ampm = hours >= 12 ? 'pm' : 'am';
            hours = hours % 12;
            hours = hours ? hours : 12; // the hour '0' should be '12'
            minutes = minutes < 10 ? '0'+minutes : minutes;
            var strTime = hours + ':' + minutes + ' ' + ampm;
            return strTime;
        }


    });

-1

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

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

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

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


1
Почему это было отклонено? Это, безусловно, самый простой и лучший способ сделать это. Большинство ответов выше не принимают во внимание летнее / зимнее время
MortenSickel

Какой смысл второй линии? Конструктор Date уже предполагает ваш местный часовой пояс. Обе эти строки возвращают дату в часовом поясе локального браузера и не отвечают на вопрос о том, как конвертировать в другой часовой пояс с переходом на летнее время.
Хлоя

-1

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

date +%s -d '1 Jan 1970'

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


-6

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

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

слишком грязный (и слишком грязный)
Maxwell sc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.