有没有办法在moment.js中轻松正确地解析像这样的链接?
August 21, 2015: 11:40 AM ET
除了ET
位(代表东部时间及其UTC-4)之外,我设法正确解析它,格式如下:
MMMM DD, YYYY: hh:mm tt ET
答案 0 :(得分:4)
一些事情:
时区缩写并非都是唯一的。见this list on Wikipedia。例如,CST有五种不同的含义。
时区缩写没有国际标准。不同的列表可能具有不同的值,并且这些值中的一些可能是发明的,并且实际上不被这些区域中的人使用。它们也可能因语言而异。
这个特殊的缩写“ET”通常表示“东部时间”,适用于北美的东部时区,特别是美国和加拿大。它是缩写的通用形式,包括东部标准时间(“EST”,UTC-5)和东部夏令时(“EDT”,UTC-4),无论哪个有效有问题的日期。
另一种表示方式是使用IANA tz database中的标识符。此特定区域最好由"America/New_York"
表示。我们可以将这些标识符与moment-timezone插件一起使用到moment.js。
var input = "August 21, 2015: 11:40 PM ET";
var format = "MMMM D, YYYY: h:mm A";
var timeZone = "America/New_York";
var m = moment.tz(input, format, timeZone);
var output = m.format(); // "2015-08-21T23:40:00-04:00"
请注意,我没有为时区包含任何格式说明符。因为它在字符串的末尾,你可以停在那里。 (如果它在字符串中的其他位置,则可以将文本放在方括号中忽略。)
另请注意,您提出的格式字符串与我推荐的格式字符串有一些其他差异。特别是tt
适用于.NET,但它暂时为a
或A
。
在上面的示例中,您必须在外部提供时区。如果您的输入可能来自不同的时区,那么这将无法正常工作,时刻无法帮助您。您需要单独将时区作为另一个输入。由于我之前描述的模糊性,Moment不会尝试识别时区缩写。
还要认识到某些日期/时间值在时区内不明确。这发生在daylight saving time结束时的秋天,创建重叠的值范围。例如,November 1, 2015: 1:30 AM ET
将发生两次,首先在EDT中,然后在EST后一小时。在这种情况下,时刻将选择第一个出现 - 恰好是白天时间,而不是标准时间。