如何将日期字符串转换为带时区的日期?

时间:2019-08-20 17:46:21

标签: javascript momentjs

假设我处于中央时区

,我有一个输入'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

的副本

2 个答案:

答案 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”。此处使用区域设置来解析星期几和月份值。