Javascript新日期(str).getTime()不适用于IST

时间:2014-01-15 09:06:56

标签: 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。

如何让IST(印度标准时间)的getTime工作。

1 个答案:

答案 0 :(得分:3)

Time zone abbreviations含糊不清。 IST可以是印度标准时间,爱尔兰标准时间或以色列标准时间。

PST工作的唯一原因是因为它在RFC 822规范(第5.1节)中特别指出,还有一些针对北美地区。而且这个规范正逐渐消失,转向ISO 8601,而XY Problem根本不使用时区缩写。

基本上 - 你不应该以这种格式解析字符串 - 永远。如果您因某种原因认为自己需要,那么您有一个moment.js。退后一步并解释你的推理,因为可能有更好的方法。

更新了答案

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

是的,它是一种“化妆”格式。没有标准的日期和时间,包括IST作为支持的时区缩写。

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

  • 您可以从字符串中删除“IST”,并附加“+0530”。大多数浏览器应该接受它。

    new Date(str.replace('IST','') + ' +0530')
    
  • 您可以使用{{3}}这样的库解析它:

    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,所以你可以在这里利用它。