Javascript new date(str).getTime() 不适用于 IST

标签 javascript date gettime

我从服务器获取以下格式的时间戳

"Wed Jan 15 14:17:06 PST 2014"

"Wed Jan 15 14:17:06 IST 2014"

当我在具有 IST 的第二个时间戳上执行 getTime 时 我得到 NaN 。请看下面:

当我这样做时:

var str = "Wed Jan 15 14:17:06 PST 2014";
var output = new Date(str).getTime();

我得到了预期的输出“1389824226000”

但是当我这样做时

var str   = "Wed Jan 15 14:17:06 IST 2014";
var output = new Date(str).getTime();

我得到的输出为 NaN。

我怎样才能使 getTime 也适用于 IST(印度标准时间)。

最佳答案

Time zone abbreviations是含糊的和不一致的。 IST 可以是印度标准时间、爱尔兰标准时间或以色列标准时间。

PST 有效的唯一原因是 RFC 822 中特别指出了它。规范(第 5.1 节),以及北美的其他一些规范。该规范正在慢慢消失,取而代之的是 ISO 8601 ,它根本不使用时区缩写。

所以基本上 - 你不应该解析这种格式的字符串 - 永远。如果您觉得出于某种原因需要,那么您有一个 XY Problem 。退一步并解释你的推理,因为可能有更好的方法。

更新答案

在您的评论中,您说更改服务器的输出是您无法控制的。好吧,那么你真的应该去找任何有能力对服务器进行更改的人并与他们交谈。服务器 API 以符合标准且易于使用的方式公开其数据非常重要。由于服务器公开的本质上是一种编造的格式,因此 API 的使用者(例如您自己)将难以处理数据。

是的,这是一种“虚构”的格式。没有包含 IST 作为支持的时区缩写的日期和时间标准。

还有其他方法可以解决这个问题,但这些都是黑客行为,不是推荐的方法:

  • 您可以从字符串中删除“IST”,并附加“+0530”。大多数浏览器应该会注意到这一点。

    new Date(str.replace('IST','') + ' +0530')
    
  • 您可以使用像 moment.js 这样的库来解析它。 :

    var s = str.replace('IST','+05:30');
    var m = moment.parseZone(s,"ddd MMM DD HH:mm:ss Z YYYY");
    
    var output = moment.toDate(); // if you need a js Date object
    var output = moment.format("whatever"); // if you want to reformat a string
    

这两者都是真正的黑客,因为它们依赖于两个不确定性:

  • 您只会使用来自您的服务器的 IST,并且它永远不会在具有不同时区的地方运行。

  • IST 固定为 +05:30,并且始终如此。许多时区会根据政客的一时兴起而发生变化,并且许多时区每年会因夏令时而发生两次变化。 IST 不使用 DST,因此您可以在这里利用它。

关于Javascript new date(str).getTime() 不适用于 IST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21133093/

相关文章:

javascript - jQuery 代码可以在 Firebug 中运行,但不能单独运行

java - java.util.Date 中的默认时区是什么

javascript - 如何在 javascript 中获取纪元的时间(以秒为单位)?

JavaScript 前导零

javascript - Iframe 的文档未定义或为空

javascript - 输入类型密码值显示为空

javascript - 如何为 Hexo 实现标签式代码块标签

java - Spring Data 使用昨天的日期更新实体

javascript - 计算 HH :MM:SS javascript 中两个日期之间的时间差