Перетворити дату в інший часовий пояс у JavaScript


336

Я шукаю функцію для перетворення дати в одному часовому поясі в інший.

Для цього потрібні два параметри,

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

Рядок часового поясу описаний у http://en.wikipedia.org/wiki/Zone.tab

Чи є простий спосіб це зробити?


1
Знайдіть зсув UTC у вказаному місті. stackoverflow.com/questions/3002910/…
Брендон Бун

3
Я хочу обчислити не лише зміщення UTC, а й літній час / літній час. Тож час повернеться правильно.
Rizky Ramadhan


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

Вимкнено набір свого часового поясу за допомогою команди unix date: дата +% s -d '1 січня 1970'
антоні

Відповіді:


191

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
Я змінив відповідь на це, оскільки це правильний і стандартний метод, не використовуючи жодної бібліотеки.
Rizky Ramadhan

5
Документація MDN чітко говорить про те, що єдиним часовим поясом, який потрібно розпізнати у всіх реалізаціях, є UTC. ( stackoverflow.com/questions/10087819/… ) Натискання кнопки [Виконати фрагмент коду] в IE11 призводить до помилки.
Вівіан-Рівер

1
Якщо хтось шукає впровадження, яке працює для всіх браузерів, він може спробувати будь-які відповіді нижче за допомогою своїх мінусів ...
Rizky Ramadhan

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 (зона) .формат (формат);" ? Той, який ви вказали у своєму коді, має помилку "Недійсна дата".
Тарек

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

4
Якщо ви не раді надсилати 180K в браузер із копією бази даних tz і може жити з деградацією до поточного часового поясу на старих браузерах, спробуйте відповідь @ lambinator, використовуючи Date.prototype.toLocaleString.
Peter V. Mørch

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
Це не враховує зміни літнього часу.
Роботи

12
не відповідає на запитання, але відповідає на мою (+1)
Reign.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 :(
Šime Vidas

10
Оскільки у FF та IE11 + це не вдається, потрібно знайти інше рішення.
jdavid.net

2
Край та хром сподобались :)
Suhail Mumtaz Awan

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/isissue/51 та ряд інших проблем, які були подані, і які, здається, не виправлені.

@nus так, але насправді не існує рішення для управління клієнтом часовий пояс / дату ... jquery ui datepicker змушує мене з розуму через це. ура
Лукас

2
@Marabunta, виглядає як часовий пояс (відповідь Брайана Ді Пальми) підтримує DST github.com/moment/moment-timezone/isissue/21
welldan97

2
Не використовуйте TimezoneJS, він помиляється про зміни DST.
матф

17

Якщо ви не хочете імпортувати велику бібліотеку, ви можете просто скористатися Intl.DateTimeFormat для перетворення об’єктів дати в різні часові пояси.

// 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

FYI: Це фактично не працює в IE11, принаймні в Windows 8.1. Коли ви намагаєтесь створити formatterоб'єкт, ви отримуєте: `` Значення параметра 'Asia / Jakarta' для 'timeZone' знаходиться поза допустимим діапазоном. Очікується: ['UTC'] `` `
ведермальний

чи є спосіб знову перетворити кінцевий результат з форматера в об’єкт Date?
mding5692

10

Зрозумів !

Хотіли примусити вказану дату = дата сервера, не мати значення місцевих налаштувань (UTC).

Мій сервер - GMT-6 -> нова дата (). GetTimezoneOffset () = 360.

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

2
Хоча це показує правильний наївний час, інформація про часовий пояс з myOldDateObj зберігається. Тож насправді це неправильний час (коли ви приймаєте час як екземпляр у часі, а не час на годинник).
gabn88

@ gabn88: Ви не зможете змінити час сервера за допомогою Javascript ... Щоб виправити час сервера, зробіть це на рівні операційної системи.
Седрік Саймон

2
Мені не потрібно фіксувати час сервера;) Час сервера для мене завжди UTC. Але я маю різну організацію в різні часові пояси. І їхні пристрої повинні завжди показувати час, де розташована їхня організація, де б вони не були.
gabn88

У нас є аналогічна проблема відображення дат завжди X часовий пояс. Ми намагаємось надіслати всі дати у строковому форматі з сервера, а у браузері просто вважаємо їх датами локальних часових поясів.
Venkateswara Rao

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. Дата залишається однаковою.
Джерард


4

Якщо вам просто потрібно конвертувати часові пояси я завантажив версію урізаною в момент-часовий пояс тільки з голою мінімальною функціональністю , . Дані ~ 1 КБ + дані:

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" та часом у 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 );

2

Слід зазначити, що я обмежений щодо зовнішніх бібліотек, якими я можу користуватися. moment.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

11
new Date();повернути місцевий часовий пояс, а не UTC
Mirko

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: 'Америка / Чикаго'}) вам потрібно оновити ці два значення, якщо ви хочете, щоб часовий пояс інших країн Дякував
Sahil Kapoor

Не чекайте. Я просто відмовився від цього, не дивлячись уважно. Чому ви додаєте 1 до currentDateTimeCentralTimeZone.getHours()? Без цього він буде працювати і так само , як seeking27 відповідають stackoverflow.com/a/40809160/1404185
chetstone

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 години?
користувач3833732

Під час використання цього методу я отримую наступне тут у Норвегії, коли консолюю журнал із Chrome: Оригінал: Чт 27 вересня 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Змінено: Чт 27 вересня 2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid). "Сентралевропеїчний сомертід" означає літній час середньої Європи. Не впевнений, чи спрацювало б це, коли вам потрібен літній час для Індії, або навпаки, коли ви перебуваєте в Індії та вам потрібен літній час для Європи тощо.
Кебман

Використання подібного setHours () не враховує переходів дня, місяця та року, наприклад, 3:30 ранку в Нью-Деллі 8-го, це 23-е вечора 7-го в Лондоні. Потім розглянемо кінець місяця, рік та високосні дні. У дати дати зробити математику <pre> нехай local_time = нова дата (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor - 60 * 60 * 1000); нехай дата_str = local_time.toISOString (). зріз (0, 10); нехай time_str = local_time.toISOString () .slice (11, -1); нехай 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-час

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

Повертається: сб, 24 грудня 2016 р., 23:00

Конвертувати з LA часу в Лондон

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" або що б там не було.

Якщо перший аргумент - це ваш часовий пояс локалі, а seconde - ваш цільовий часовий пояс, він повертає об’єкт 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 () через кожні хвилини. формат функції AMPM () керує 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якщо ви, як я, перебуваєте в Австрії (а це літо).

Я читав, що різні функції дати можуть проявляти нестандартну поведінку в деяких браузерах, тому спершу протестуйте це. Я можу підтвердити, що він працює в Chrome.


1
Чому це було проголосовано? Це, безумовно, найпростіший і найкращий спосіб зробити це. Більшість відповідей вище не враховують літній / зимовий час
MortenSickel

У чому сенс другого рядка? Конструктор дат уже передбачає ваш локальний часовий пояс. Обидва ці рядки повертають дату в часовому поясі локального веб-переглядача та не відповідають на питання про перетворення в інший часовий пояс із літним часовим часом.
Хлоя

-1

Зсув часової зони для вашого поточного часового поясу

date +%s -d '1 Jan 1970'

За мій часовий пояс GMT + 10 (Австралія) він повернувся до -36000


-6

швидка та брудна ручна зміна години та повернення:

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

занадто брудно (і занадто безладно)
Максвелл sc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.