Как указать формат часового пояса и объекта даты на правильный момент, чтобы я не получил неверную дату и предупреждение о том, что момент устарел? - PullRequest
1 голос
/ 21 июня 2019

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

Когда я делаю это таким образом, у меня не получается момент устарела.

let data = moment(date, 'YYYY-MM-DD HH:MM').tz(TIMEZONE); //moment('2014-06-01 12:00:00Z').tz(TIMEZONE); // TIMEZONE = 'America/New_York'
console.log(data.format('MM/DD/YYYY'))
let value = inventoryBase.lastUpdated + SPACE + data.format('MM/DD/YYYY') + ' at ' + data.format('LT') + SPACE + moment.tz([2012, 0], TIMEZONE).zoneAbbr();
value = value + ' by ' + lastUpdated.editedBy;

Но вывод значения неверен:

Last updated Invalid date at Invalid date EST by System

Когда я делаю это таким образом, момент становится устаревшим.

let data = moment(date).tz(TIMEZONE); //moment('2014-06-01 12:00:00Z').tz(TIMEZONE);
let value = inventoryBase.lastUpdated + SPACE + data.format('MM/DD/YYYY') + ' at ' + data.format('LT') + SPACE + moment.tz([2012, 0], TIMEZONE).zoneAbbr();
value = value + ' by ' + lastUpdated.editedBy;

Но вывод значения правильный:

Last updated 05/01/2019 at 3:59 AM EST by System

Момент устарела ошибка:

Deprecation warning: value provided is not in a recognized RFC2822 or ISO 
format. moment construction falls back to js Date(), which is not reliable 
across all browsers and versions. Non RFC2822/ISO date formats are 
discouraged and will be removed in an upcoming major release. Please refer 
to http://momentjs.com/guides/#/warnings/js-date/ for more info.

1 Ответ

1 голос
/ 21 июня 2019

Попробуйте следующее:

const data = moment.tz(date, 'YYYY-MM-DD HH:mm:ssZ', TIMEZONE);
const value = `${inventoryBase.lastUpdated} ${data.format('L [at] LT zz')} by ${lastUpdated.editedBy}`;

Несколько других пунктов:

  • В исходном коде он работал неправильно, поскольку строка формата не соответствовала формату данных. MM - месяцы, mm - минуты, а вы не включили секунды.

  • Во второй попытке вы получили предупреждение об устаревании, поскольку вы предоставили данные в формате, который отсутствует в списке известных поддерживаемых строк .

  • Вы использовали аббревиатуру зоны для произвольной даты вместо той, о которой идет речь. Сокращения часовых поясов меняются в зависимости от даты, поэтому лучше получить их в тот же момент, когда вы работаете.

  • Не рекомендуется смешивать токенизированные форматы (MM/DD/YYYY) и форматы с поддержкой локали (LT) в одной выходной строке. Вместо этого я использовал L, так как он получает формат даты для локали, с которой вы работаете.

  • Поскольку у вас есть Z в ваших данных, они всегда будут рассматриваться как UTC. Таким образом, вы можете пропустить парсинг с помощью moment.tz. Если бы у вас не было Z, то вместо этого вы бы прошли moment.utc(data, format).tz(timezone).

  • Я использовал JavaScript шаблонные литералы в своем ответе, потому что я думаю, что они более чисты, чем конкатенация для подобных случаев.

...