Изменение часового пояса даты в Javascript? - PullRequest
2 голосов
/ 19 июня 2020

У меня дата в формате UT C `2020-06-19T03: 55: 12.000Z. Теперь я конвертирую дату в часовом поясе США как

let syncDate = moment(date, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]')
    .subtract(7, 'hours')
    .format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');

Это дает мне дату на 7 часов позже, чем дата США. Но мне нужна дата в формате ниже

2020-06-18T21:00:24.523-07:00 

Здесь, если мы видим, что часы определены как -7, пожалуйста, расскажите, как мы можем достичь того же?

Ответы [ 4 ]

2 голосов
/ 19 июня 2020

Вы не можете извлечь часовой пояс из даты, потому что в нем нет информации о часовом поясе. Вы сказали: «Я конвертирую дату в часовом поясе США как», но вы этого не сделали. Вы просто уменьшили его на 7 часов. Часовой пояс по-прежнему UT C.

Вы должны использовать moment-timezone (не обрабатывать вещи жестким способом и вручную, как сказал @GetSet). Вот решение:

const moment = require('moment'); 
const tz = require('moment-timezone');

let date = moment('2020-06-19T03:55:12.000Z');
let syncDate = date.tz('America/Los_Angeles')
console.log(syncDate.format());

Но я предлагаю вам использовать Day.js. Код будет:

const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
dayjs.extend(utc);

const dDate = dayjs('2020-06-19T03:55:12.000Z');

console.log(dDate.utcOffset(-7*60).format()); //2020-06-18T20:55:12-07:00

Раньше я использовал moment.js. Пробовал Date-fnd 24 часа. И, наконец, я перешел на День. js. Он новый (начало в конце 2018 года), но он растет так быстро ( взгляните на эту ссылку и укажите срок действия 5 лет). Самое замечательное в этом то, что « ОНО ВСЕГДА ДЕЛАЕТ, ЧТО ГОВОРИТ ». Moment и Date-fns - нет. (не всегда). Он использует оболочку, поэтому вы никогда не работаете напрямую с объектом Date. Решает трудности и проблемы. Это неизменяемый и всегда возвращает новый объект, и вы можете связывать функции. Day. js имеет наименьший размер (2 КБ). Документация отличная, и вы можете очень быстро запустить ее. (Более понятно, как работают другие библиотеки.)

Здесь я должен сказать, что Dayjs производительность не так хороша, как Moment в расчетах, но намного лучше (чем особенно Moment) при синтаксическом анализе и форматировании.

Я настоятельно рекомендую вам прочитать эту статью: Почему вы не должны использовать Moment. js


Edit (1): как @GetSet упоминается в комментарии для OP, которые могут нуждаться в решении в Moment. js Я добавил его к ответу.

Edit (2): Добавление причины, по которой вы не можете достичь своего результата так, как OP решает его.

1 голос
/ 19 июня 2020
  1. new Date() зависит от настройки даты на локальном компьютере - если какой-либо пользователь имеет неправильную дату на своем локальном компьютере - ваша система будет принимать неправильные даты от этих пользователей.
  2. Если вы работаете с датами в фоновом режиме (сохранение в базе данных или любые другие манипуляции) - сгенерируйте его в фоновом режиме (php, java et c.) и затем отправьте вам html / javascript файлы.
0 голосов
/ 19 июня 2020

Здесь очень важно отметить несколько моментов.

  1. В США нет одного часового пояса, их довольно много, например America / Los_Angeles, America / Денвер, Америка / Чика go, Америка / Нью-Йорк, см. список часовых поясов IANA для всех из них.

  2. Пожалуйста, не выполняйте преобразование из одного часового пояса к другому, используя смещение fixed , это действительно fr agile. Вы не поверите, сколько ошибок я видел за свою карьеру (от других, и да, от себя!) Из-за этой одной ошибки. Во многих часовых поясах используется Летнее время , поэтому смещение часового пояса UT C зависит от даты. Например, Pacifi c Timezone в настоящее время варьируется от UT C -08: 00 до UT C -07: 00.

Я бы предложил использовать Moment Timezone для преобразования из одного часового пояса в другой.

Например:

const dateString = `2020-06-19T03:55:12.000Z`;
const timezones = ["America/New_York", "America/Chicago", "America/Denver", "America/Los_Angeles"];

console.log(`Time in UTC:`, moment(dateString).toISOString());

// Show the time in each timezone
timezones.forEach(timezone => { 
    let timeLocal = moment.tz(dateString, timezone);
    console.log(`Time in ${timezone}:`, timeLocal.format('YYYY-MM-DD[T]HH:mm:ss.SSSZ'))
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script> 
<script src="https://momentjs.com/downloads/moment-timezone-with-data.js">
</script> 
0 голосов
/ 19 июня 2020

вы можете использовать Date().toLocalString() метод

// example:
var d = new Date().toLocalString("en-US", {
    month: "long",
    day: "2-digit",
    year: "numeric",
});

для получения дополнительной информации см .:

https://www.w3schools.com/jsref/jsref_tolocalestring.asp

...