如何在正确的时刻指定时区和日期对象格式,以使我不会收到无效的日期并且不建议使用时刻?

时间:2019-06-21 17:57:17

标签: javascript reactjs datetime momentjs

我试图设置日期格式和时区,然后当我尝试格式化矩以提取日期时,它只会返回无效日期。

以这种方式执行操作时,我不会得到瞬间。

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 个答案:

答案 0 :(得分:1)

尝试以下操作:

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是分钟,而您没有包括几秒钟。

  • 在第二次尝试中,您收到了弃用警告,因为您提供的数据格式不是the list of known supported strings

  • 您将区域的缩写改为任意日期,而不是所讨论的日期。时区缩写因日期而异,因此最好在工作的同一时间获取。

  • 在同一输出字符串中混合标记化格式(MM/DD/YYYY)和可识别语言环境的格式(LT)不好。我改用L,因为它获取了您正在使用的语言环境的日期格式。

  • 由于您的数据中有一个Z,因此它将始终被视为UTC。因此,您可以跳过使用moment.tz进行解析的权利。如果您没有Z,则可以改用moment.utc(data, format).tz(timezone)

  • 我在回答中使用了JavaScript template literals,因为在这种情况下,它们比串联更干净。