在RSS提要中将IST日期转换为UTC



我有一个字符串格式的日期'Wed,08 Apr 2020 15:24:06 IST'我想把它转换成JavaScriptDate,这样我就可以执行操作了。我想从IST或api传递的任何信息中获取UTC日期,我必须根据用户时区进行转换,这样我就无法从中删除IST。IST(印度标准时间(只是一个例子,它可以是AET(澳大利亚东部时间(、EET(东欧时间(等。

new Date('Wed, 08 Apr 2020 15:24:06 IST')

我收到无效日期

这个字符串来自《印度时报》的RSS订阅源,比如这个。如何处理RSS源中的时区缩写?

如果没有额外的上下文,这是不可能的。时区缩写不是标准化的,也不是唯一的。

在你的例子中,你说IST的意思是";印度标准时间";然而IST也是用于";以色列标准时间";以及";爱尔兰标准时间";。所有这些都有非常不同的时区偏移。

另一个常见的例子是CST;"中央标准时间"古巴标准时间";,或";中国标准时间";。

相反,您应该返回到原始源并获得时区偏移量(如+05:30(或时区标识符(如Asia/Kolkata(,或者以其他方式派生该上下文。

你说你正在从《印度时报》的RSS订阅源中检索这个时间戳。这就是我所说的附加上下文类型。既然你知道它是印度新闻来源,你可以放心地假设IST的意思是印度标准时间。

你应该知道,《印度时报》的RSS提要格式没有正确使用时间戳。RSS 2.0规范要求时间戳采用RFC 822格式。在该格式中,IST不是有效的时区。事实上,如果你把它放进一个像Feed Validator这样的网站,它会给你错误";元素必须是RFC-822日期时间";。

请注意,RFC 822已经过时了。它被RFC 2822取代,然后又被RFC 5322取代。时区缩写已全部作废,并移至obs-zone部分。因此,它们真的根本不应该被使用。只应显示数字偏移。也就是说,许多RSS实现遵循旧标准,因此接受obs-zone中指定的一些缩写是合理的。具体来说,所有实现都应该接受以下内容:

"Z"    == "+0000"
"UT"   == "+0000"
"GMT"  == "+0000"
"EST"  == "-0500"
"EDT"  == "-0400"
"CST"  == "-0600"
"CDT"  == "-0500"
"MST"  == "-0700"
"MDT"  == "-0600"
"PST"  == "-0800"
"PDT"  == "-0700"

(其他军事区域"A"-"Y"永远不应该使用。(

注意,IST不在其中。因此,为了直接回答您的问题,当解析包含非标准时区缩写的RFC 822时间戳时,您需要在解析之前将缩写替换为偏移量。在这种情况下:

var s = 'Wed, 08 Apr 2020 15:24:06 IST';
var d = new Date(s.replace('IST', '+0530'));

您也可以替换我列出的其他obs-zone缩写,但通常不需要。ECMAScript的大多数实现都会解析这些(即使规范不要求它们(。

如果您遇到其他带有其他时区缩写的RSS提要,则需要手动确定如何解释它们。没有明确的名单。

一些附加阅读:

  • RSS日期和时间最佳实践
  • RSS 2.0规范
  • ATOM规范脱离了RFC 822,转而使用RFC 3339时间戳(符合ISO 8601(,部分原因是为了避免这个问题

试试这个:

moment('Wed, 08 Apr 2020 15:24:06').utc();

你会因为IST而得到错误,只需删除它,它不会给你一个错误

如果你只想要日期,那么使用这个:

moment('Wed, 08 Apr 2020 15:24:06').utc().format('YYYY-MM-DD');

如果您想以UTC解析或显示时刻,可以使用moment.UTC((

var res = moment.utc("Wed, 08 Apr 2020 15:24:06",'DD-MMM-YYYY').format("YYYY-MM-DD");
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

最新更新