未知日期格式/日期(1427982649000-0400)/

时间:2017-04-05 19:33:54

标签: javascript angularjs

我需要在屏幕上显示一些日期值,但我收到的格式是我不知道的。有谁知道这是什么格式以及如何转换它们?

例如,我得到了这个:

/Date(1427982649000-0400)/

在数据库中存储为

2015-04-02 09:50:49.000

我真的不知道从哪里开始看。

3 个答案:

答案 0 :(得分:9)

这是一个以毫秒为单位的unix时间戳,后跟一个时区(以小时为单位的变化与UTC不同)。

所以,它是UTC的-4小时,即1970年1月1日之后的1427982649秒。

用于检查unix时间戳的不错的小工具:http://www.unixtimestamp.com/index.php(不要忘记在发布它们之前将毫秒转换为秒)

/ edit:要添加一些额外的信息 - “时区转换”似乎跟随RFC822(和/或可能是其他一些RFC),-0400可以通过语法“+/- HHMM来解释“指明那里,所以确切地说它意味着-04小时,00分钟。

答案 1 :(得分:3)

实际时间和日期转换为毫秒,并且遵循1970年1月1日的Unix时间。 因为它是Unix计算机启动时的日期。

但是你可以根据那个时间使用一些循环或转换将毫秒转换为实际时间。

答案 2 :(得分:1)

  

有人知道这是什么格式以及如何转换它们?

似乎“/ Date(1427982649000-0400)/”是以毫秒为单位的时间值,后跟偏移量为±HHmm。要将其转换为日期,请使用由偏移量调整的时间值。

假设偏移使用典型的符号约定,则需要减去正偏移并添加负偏移以获得正确的UTC值,那么类似下面的内容应该适合:

var s = '/Date(1427982649000-0400)/';

// Get the number parts
var b = s.match(/\d+/g);

// Get the sign of the offset
var sign = /-/.test(s)? -1 : +1;

// Adjust the time value by the offset converted to milliseconds
// and use to create a Date
var ms = +b[0] + sign * (b[1].slice(0,2)*3.6e6 + b[1].slice(-2)*6e4);

console.log(new Date(ms).toISOString()); // 2015-04-02T17:50:49.000Z

在您的示例中,“2015-04-02 09:50:49.000”没有时区,因此它表示具有不同偏移的每个时区的不同时刻。如果这是存储在数据库中的实际值,那么我猜丢失的时区是UTC-0800。使用UTC存储值并包含偏移量要好得多,那么主机时区就不相关了。

这里事情很复杂,因为ECMAScript时区偏移与正常惯例相反,即格林威治西部为正,东部为负。如果应用该约定,则“/ Date(1427982649000-0400)/”将转换为2015-04-02T09:50:49.000Z,这可能是您所追求的。

如果是这种情况,只需更改行中的符号:

var sign = /-/.test(s)? -1 : +1;

var sign = /-/.test(s)? +1 : -1;