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

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

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

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

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

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

36 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

Понял!

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

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

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

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

Использование библиотеки luxon :

      import { DateTime } from "luxon";

// Convert function:
const convertTz = (datetime, fromTz, toTz, format='yyyy-MM-dd HH:mm:ss') => {
  return DateTime.fromFormat(datetime, format, { zone: fromTz }).setZone(toTz).toFormat(format);
}

// Use it like this:
console.log(convertTz('2021-10-03 19:00:00', 'Europe/Lisbon', 'America/New_York'));

Простое, функциональное и кроссбраузерное решение для преобразования между часовыми поясами и преобразования даты в строку с выбранным часовым поясом:

      export function convertTimeZone(
  date: Date,
  timeZoneFrom?: string | null, // default timezone is Local
  timeZoneTo?: string | null, // default timezone is Local
): Date {
  const dateFrom = timeZoneFrom == null
    ? date
    : new Date(
      date.toLocaleString('en-US', {
        timeZone: timeZoneFrom,
      }),
    )

  const dateTo = timeZoneTo == null
    ? date
    : new Date(
      date.toLocaleString('en-US', {
        timeZone: timeZoneTo,
      }),
    )

  const result = new Date(date.getTime() + dateTo.getTime() - dateFrom.getTime())

  return result
}

export function dateToString(date: Date, timeZone: string): string {
  date = convertTimeZone(date, 'UTC', timeZone)

  const year = date.getUTCFullYear().toString().padStart(4, '0')
  const month = (date.getUTCMonth() + 1).toString().padStart(2, '0')
  const day = date.getUTCDate().toString().padStart(2, '0')
  const hours = date.getUTCHours().toString().padStart(2, '0')
  const minutes = date.getUTCMinutes().toString().padStart(2, '0')
  const seconds = date.getUTCSeconds().toString().padStart(2, '0')

  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}

Тесты

      describe('date', function () {
  it('convertTimeZone', function () {
    // UTC => UTC
    expect(convertTimeZone(new Date('2020-01-01T00:00:00.000Z'), 'UTC', 'UTC'))
      .toEqual(new Date('2020-01-01T00:00:00.000Z'))

    // UTC => Europe/Kiev
    expect(convertTimeZone(new Date('2020-01-01T00:00:00.000Z'), 'UTC', 'Europe/Kiev'))
      .toEqual(new Date('2020-01-01T02:00:00.000Z'))

    // Europe/Kiev => UTC
    expect(convertTimeZone(new Date('2020-01-01T00:00:00.000Z'), 'Europe/Kiev', 'UTC'))
      .toEqual(new Date('2019-12-31T22:00:00.000Z'))

    // Europe/Kiev => America/Los_Angeles
    expect(convertTimeZone(new Date('2020-01-01T00:00:00.000Z'), 'Europe/Kiev', 'America/Los_Angeles'))
      .toEqual(new Date('2019-12-31T14:00:00.000Z'))

    // America/Los_Angeles => Europe/Kiev
    expect(convertTimeZone(new Date('2020-01-01T00:00:00.000Z'), 'America/Los_Angeles', 'Europe/Kiev'))
      .toEqual(new Date('2020-01-01T10:00:00.000Z'))

    // Local => Local
    expect(convertTimeZone(new Date('2020-01-01T00:00:00.000Z'), null, null))
      .toEqual(new Date('2020-01-01T00:00:00.000Z'))

    // forward and backward for timezone list
    const timeZones = [
      null, // Local
      'UTC',
      'Europe/Kiev',
      'America/Los_Angeles',
      'America/New_York',
      'America/Chicago',
      'America/Denver',
      'Europe/London',
      'Europe/Paris',
      'Europe/Moscow',
      'Europe/Berlin',
      'Asia/Tokyo',
      'Asia/Shanghai',
      'Asia/Hong_Kong',
      'Asia/Kolkata',
      'Australia/Sydney',
      'Australia/Melbourne',
      'Australia/Perth',
      'Australia/Brisbane',
    ]
    for (const timeZoneFrom of timeZones) {
      for (const timeZoneTo of timeZones) {
        const date = new Date('2020-01-01T00:00:00.000Z')
        const result = convertTimeZone(date, timeZoneFrom, timeZoneTo)
        const resultBack = convertTimeZone(result, timeZoneTo, timeZoneFrom)
        expect(resultBack).toEqual(date)
      }
    }
  })

  it('dateToString', function () {
    expect(dateToString(new Date('2020-01-01T00:00:00.000Z'), 'UTC'))
      .toEqual('2020-01-01 00:00:00')

    expect(dateToString(new Date('2020-01-01T00:00:00.000Z'), 'Europe/Kiev'))
      .toEqual('2020-01-01 02:00:00')

    expect(dateToString(new Date('2020-01-01T00:00:00.000Z'), 'America/Los_Angeles'))
      .toEqual('2019-12-31 16:00:00')

    expect(dateToString(new Date('2020-01-01T00:00:00.000Z'), 'America/New_York'))
      .toEqual('2019-12-31 19:00:00')
  })

  it('dateToString current', function () {
    console.log(`Current date UTC: ${dateToString(new Date(), 'UTC')}`)
    console.log(`Current date Europe/Kiev: ${dateToString(new Date(), 'Europe/Kiev')}`)
    console.log(`Current date America/Los_Angeles: ${dateToString(new Date(), 'America/Los_Angeles')}`)
  })
})

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

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

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

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

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

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

Сделайте это максимально просто:

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

      let timezone = "Asia/Jakarta";
let date = new Date("2012/04/10 10:10:30 +0000");
let formattedDate = new Intl.DateTimeFormat("en-US", { dateStyle: "long" , timeStyle: "short",  timeZone: timezone}).format(date);

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

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

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

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

Я недавно сделал это в 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 с правильным смещением.

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

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

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

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

Укажите желаемый часовой пояс, например "Азия / Тегеран", чтобы изменить текущее время на этот часовой пояс. Я использовал "Азия / Сеул".

Вы можете использовать следующие коды. при необходимости измените стиль.

Имейте в виду, что если вы хотите использовать формат h: m: s вместо HH:MM:SS, вам придется удалить "function kcwcheckT(i)".

function kcwcheckT(i) {
  if (i < 10) {
    i = "0" + i;
  }
  return i;
}
function kcwt() {
var d = new Date().toLocaleString("en-US", {timeZone: "Asia/Seoul"});
d = new Date(d);
  var h = d.getHours();
  var m = d.getMinutes();
  var s = d.getSeconds();
  h = kcwcheckT(h);
  m = kcwcheckT(m);
  s = kcwcheckT(s);
  document.getElementById("kcwcurtime").innerHTML = h + ":" + m + ":" + s;
  var days = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
document.getElementById("kcwcurday").innerHTML = days[d.getDay()]
}
kcwt();
window.setInterval(kcwt, 1000);
@import url('https://fonts.googleapis.com/css2?family=Nunito&display=swap');

.kcwsource {color:#040505;cursor: pointer;display:block;width: 100%;border: none;border-radius:5px;text-align:center;padding: 5px 10px 5px 10px;}
.kcwsource p {font-family: 'Nunito', sans-serif;}


.CurTbx {color:#040505;cursor: pointer;display:block;width: 100%;border: none;border-radius:5px;text-align:center;padding: 5px 10px 5px 10px;}
.kcwcstyle {font-family: 'Nunito', sans-serif; font-size: 22px;display: inline-block;}
.kcwcurstinf {font-family: 'Nunito', sans-serif; font-size: 18px;display: inline-block;margin: 0;}
.kcwcurday {margin: 0;}
.kcwcurst {margin: 0 10px 0 5px;}

/*Using the css below you can make your style responsive!*/

@media (max-width: 600px){
  .kcwcstyle {font-size: 14px;}
  .kcwcurstinf {font-size: 12px;}
}
<div class="kcwsource"><p>This Pen was originally developed for <a href="http://kocowafa.com" target="_blank">KOCOWAFA.com</a></p></div>
<div class="CurTbx"><p class="kcwcurst kcwcstyle" id="kcwcurday"></p><p class="kcwcurst kcwcstyle" id="kcwcurtime"></p><p class="kcwcurstinf">(Seoul, Korea)</p></div>

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

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

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

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

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

Просто установите часовой пояс желаемой страны, и вы можете легко отображать в 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;
        }


    });

есть проблема с сервером, выберите стандартный часовой пояс gmt+ 0000, вы можете изменить его, используя библиотечный момент-часовой пояс в javascript

      const moment = require("moment-timezone")
const dateNew = new Date()
const changeZone = moment(dateNew);
changeZone.tz("Asia/Karachi").format("ha z");
// here you can paste "your time zone string"

Немного избыточно со всеми этими ответами, но это сработало для меня для получения текущего объекта Date с определенным почасовым смещением.

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

Другие вопросы по тегам