【问题标题】:Convert IST date to UTC in RSS feed在 RSS 提要中将 IST 日期转换为 UTC
【发布时间】:2020-04-11 01:01:25
【问题描述】:

我有一个字符串格式的日期 'Wed, 08 Apr 2020 15:24:06 IST' 我想将其转换为 javascript Date 以便我可以执行操作。 我想从 IST 或 api 传递的任何内容获取 UTC 日期,我必须根据用户时区对其进行转换,因此我无法从中删除 IST。 IST(印度标准时间)只是一个例子,它可以是 AET(澳大利亚东部时间)、EET(东欧时间)等......

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

我的日期无效

这个字符串来自Times Of India RSS feeds,比如this one。如何处理 RSS 提要中的时区缩写?

【问题讨论】:

  • 您已标记LuxonMomentJS,但我看不到任何相关代码!
  • 实际上我想从 IST 或 api 传递的任何内容获取 UTC 日期,我必须根据用户时区对其进行转换,因此我无法从中删除 IST。 IST(印度标准时间)只是一个例子,它可以是 AET(澳大利亚东部时间)、EET(东欧时间)等......

标签: javascript date rss


【解决方案1】:

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

在您的示例中,您说IST 对您来说意味着“印度标准时间”,但是IST 用于“以色列标准时间”和“爱尔兰标准时间”。所有这些都有非常不同的时区偏移量。

另一个常见的例子是CST,它可以是“Central Standard Time”、“Cuba Standard Time”或“China Standard Time”。

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

您说您正在从an RSS feed from Times of India 检索此时间戳。这就是我所说的附加上下文的类型。既然您知道它是印度新闻来源,您可以放心地假定 IST 表示印度标准时间。

您应该知道 Times of India 的 RSS 提要格式没有正确使用时间戳。 RSS 2.0 specification 要求时间戳位于 RFC 822 format 中。在该格式中,IST 不是有效的时区。事实上,如果你把它放到像Feed Validator 这样的网站,它会给你错误"element must be an RFC-822 date-time"

请注意,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 提要,您将需要手动确定如何解释它们。没有明确的清单。

一些补充阅读:

【讨论】:

  • 经过一些研究,我知道 IST 不仅是印度标准时间。我什至无法生成这样的日期,但是我如何在 Times Of India RSS 提要中获得这种日期。 timesofindia.indiatimes.com/rssfeeds/-2128672765.cms 你可以看看这个。在此示例中,我可以简单地将 IST 替换为 GMT+330 的 +0330,这将解决此问题,但可能会发生另一个国家/地区的 RSS 提要可能会按照类似 IST 的格式使用日期,然后我必须面对同样的问题,所以我正在寻找根据以该格式给出的日期为我提供 UTC 日期的功能。
  • +0530,而不是+0330。但是,是的。请参阅我更新的扩展答案。我还将编辑您的问题以将其用于 RSS 提要。
【解决方案2】:

试试这个:

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

而且由于 IST 导致您遇到错误,只需将其删除,它就不会给您错误

如果您只想要日期,请使用:

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

【讨论】:

  • 实际上我想从 IST 或 api 传递的任何内容获取 UTC 日期,我必须根据用户时区对其进行转换,因此我无法从中删除 IST。 IST(印度标准时间)只是一个例子,它可以是 AET(澳大利亚东部时间)、EET(东欧时间)等......
  • 你做错了,正确的格式是new Date('Wed, 08 Apr 2020 15:24:06 (India Standard Time)'而不是new Date('Wed, 08 Apr 2020 15:24:06 IST')
【解决方案3】:

如果要解析或显示 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>

【讨论】:

  • 实际上我想从 IST 或 api 传递的任何内容获取 UTC 日期,我必须根据用户时区对其进行转换,因此我无法从中删除 IST。 IST(印度标准时间)只是一个例子,它可以是 AET(澳大利亚东部时间)、EET(东欧时间)等......
猜你喜欢
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2011-11-06
相关资源
最近更新 更多