#javascript
#javascript
Вопрос:
Я хочу получить время локали из формата ISO, которое не зависит от локального браузера. Например, я хочу получить дату ko-KR
, хотя браузер открылся в другом часовом поясе (например, в en-US).
Строка ISO, которая у меня есть 2020-10-22T00:00:00.000Z
, и если я использую new Date
ее как
new Date('2020-10-22T00:00:00.000Z');
он возвращает дату 2020-10-21 16:00:00 GMT-0800
.
Но я хочу получить дату в Корее, например 2020-10-22 09:00:00 GMT 0900
.
toLocaleString
Метод возвращает строковое значение. Но я хочу, чтобы объект date соответствовал определенной локали.
Комментарии:
1. В чем ваш вопрос и что вы пробовали?
2. Вы пробовали что-то вроде
var koreaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Seoul"});
3. Я бы перестал рекомендовать momentjs @ThomasSablik, поскольку его автор считает это «сделанным» и «устаревшим»: p
4.Вы можете добавить смещение с помощью, например
new Date('2020-10-22T00:00:00.000-0400');
, но вопрос выглядит как недоразумение. Временная метка сохраняется как UTC. Оно преобразуется только для вывода. Объект date не изменится. «Создает экземпляр даты JavaScript, который представляет один момент времени в формате, не зависящем от платформы. Объекты Date содержат число, представляющее миллисекунды с 1 января 1970 года по UTC.» developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
Ответ №1:
«Метод toLocaleString возвращает строковое значение. Но я хочу, чтобы объект date соответствовал определенной локали.
Это невозможно. Временная метка сохраняется как UTC. Оно преобразуется только для вывода. Объект date не изменится.
Создает экземпляр даты JavaScript, который представляет отдельный момент времени в формате, не зависящем от платформы. Объекты Date содержат число, представляющее миллисекунды с 1 января 1970 года по UTC.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
Ответ №2:
вы можете использовать moment-timezone
, чтобы получить время в соответствии с конкретным часовым поясом.
let date= moment()
let dateAsPerTimeZone = moment.tz(date,'Asia/Seoul');
console.log(dateAsPerTimeZone.format());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js"></script>
Комментарии:
1. Как вы можете прочитать в комментариях, moment является устаревшим и больше не должен использоваться.
Ответ №3:
Итак, я создаю функцию для решения этой проблемы. Дело в том getTimezoneOffset
, . Ниже приведен мой код, и процесс возврата значения и функции может отличаться в зависимости от ваших потребностей.
const ko_offset = -540 * 60 * 1000; // it is the Asia/Seoul time zone offset in milliseconds
/**
* Input : any locale date object
* Output : translated input date object to Asia/Seoul timezone date object
*/
const toKoreaTime = date => {
const d = typeof date === 'string' ? new Date(date) : date;
let kd;
if (d.getTimezoneOffset() === ko_offset) {
kd = d;
} else {
kd = new Date(d.getTime() (d.getTimezoneOffset() * 60 * 1000) - ko_offset);
}
const Y = kd.getFullYear(), M = kd.getMonth() 1, D = kd.getDate(), h = kd.getHours(), m = kd.getMinutes(), s = kd.getSeconds();
return { Y, M, D, h, m, s };
};
Его можно использовать для получения определенного времени даты часового пояса для любой даты часового пояса. Например, если я хочу узнать дату и время Кореи в США
const usDate = new Date(); // I'm use it in the US. (UTC -8)
const koDate = toKoreaTime(usDate); // return Korea date and time. (UTC 9)