假设我处于中央时区
,我有一个输入'Fri Aug 16 16:06:38 CDT 2019'
,预期输出为4:06 PM Friday
东部时区中某人的预期输出为5:06 PM Friday
我在以下代码段中出现错误
const input = 'Fri Aug 16 16:06:38 CDT 2019';
const date = moment(input).format('dddd MMM DD HH:MM:SS ZZZ YYYY');
console.log('date', date);
<script src="https://momentjs.com/downloads/moment.min.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>
不是this
的副本答案 0 :(得分:1)
使用以下格式:
const input = 'Fri Aug 16 16:06:38 CDT 2019';
const date = moment(input).format('hh:mm A dddd');
console.log('date', date);
<script src="https://momentjs.com/downloads/moment.min.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>
答案 1 :(得分:1)
在这种情况下,您需要一种格式来告诉moment
如何解析所提供的日期字符串,而不是如何显示它。为此,您应该使用带有两个参数的moment
构造函数-String + Format。
请不要忘记格式区分大小写。 MM
是一个月代码,因此您应该使用mm
来解析分钟(ss
来解析秒)。对于输出,您需要在给定的日期对象上调用local()
以使用本地时间来显示时刻,而不是原始时刻。
但是,这里还有另一个警告:momentjs
不知道如何在这种类型的工作流程中处理缩写的偏移量(例如CDT,PST等);自this PR起,它仅在RFC2822解析工作流中支持它们的子集。
您当然可以自己实现它,使用该请求中的表将缩写词替换为时区偏移量,然后继续使用ZZ
标志。像这样:
const replaceAbbr = (() => dtstr => {
const rfc2822Timezones = {
' GMT': ' +0000',
' EDT': ' -0400',
' EST': ' -0500',
' CDT': ' -0500',
' CST': ' -0600',
' MDT': ' -0600',
' MST': ' -0700',
' PDT': ' -0700',
' PST': ' -0800'
};
return dtstr.replace(/ [A-Z]{2}T/, abbr => rfc2822Timezones[abbr] || abbr);
})();
const input = 'Fri Aug 16 16:06:38 CDT 2019';
const inputWithTz = replaceAbbr(input);
const date = moment(inputWithTz, 'ddd MMM DD HH:mm:ss ZZ YYYY', 'en');
console.log('output in UTC: ', date.utc().format('h:mm A dddd'));
// output in UTC: 9:06 PM Friday
console.log('output in local: ', date.local().format('h:mm A dddd'));
// depends
<script src="https://momentjs.com/downloads/moment.min.js"></script>
实际上,我在这里使用了第三个参数来指定语言环境,以防万一不是“ en”。此处使用区域设置来解析星期几和月份值。