【问题标题】:Parsing to milliseconds changes date解析为毫秒更改日期
【发布时间】:2015-04-01 17:02:49
【问题描述】:

我在解析从服务器获取的 json 中的日期时遇到问题。日期格式为“YYYY-MM-dd HH-mm-ss CST”(时区在末尾),这是第一个条目:

2015-01-06 00:00:00 CST

我正在使用Highcharts 绘制数据,我需要将其解析为毫秒,以便在 x 轴(日期时间)中正确使用。我对javascript中的日期转换不是很熟悉,所以我不断得到奇怪的结果(以毫秒为单位的解析值总是错误的,因此在不正确的点绘制图表)。

//obj['Time'] has the time value received = "2015-01-06 00:00:00 CST"

var fecha=obj['Time'].split(" ")[0].split("-"),
    hora=obj['Time'].split(" ")[1].split(":")[0];

var from = Date.parse( new Date(fecha[0], fecha[1], fecha[2], hora) );

所以,我尝试了以下方法:1) 直接解析 obj['Time']。 2) 使用“手动拆分输入日期”中的显式值创建一个新的日期对象(存储在 'from' 变量中)并对其进行解析。

console.log("Original: " + obj['Time'] );
console.log("1) " + Date.parse(obj['Time']));
console.log("2) " + from);

console.log("Response 1: " + new Date( Date.parse(obj['Time']) ) );
console.log("Response 2: " + new Date( from ) );

这些是结果:

Original: 2015-01-06 00:00:00 CST
1) 1420524000000
2) 1423177200000

Response 1: Tue Jan 06 2015 07:00:00 GMT+0100 (CET)
Response 2: Fri Feb 06 2015 00:00:00 GMT+0100 (CET)    

我相信 new Date() 正在使用我的本地时区并进行转换,因为该值的偏移量为 1 小时 (GMT+0100 ???)...所以一切都有不应该存在的“偏移量”。也许有人可以告诉我解析这个的正确方法是什么:)

谢谢!

注意:我不需要在图表中显示时区,我只需要有正确的日期时间值即可。

另外,在创建新的 Date 对象时,我知道月份的 0 索引,这就是为什么它显示为二月而不是一月,但该修复仍然不正确

【问题讨论】:

标签: javascript date datetime highcharts milliseconds


【解决方案1】:

var date = "2015-01-06 00:00:00 CST".replace(/-/g, "/");
var orgDate = new Date(date);
var dateParsed = Date.parse(orgDate); //parse to timestamp. (In milliseconds)

document.write("Timestamp CST: " + dateParsed);
document.write("<br />");
document.write("<br />"); 
var dateToUTC = new Date(dateParsed);

document.write("UTC/GMT: " + dateToUTC.toUTCString());
document.write("<br />");
document.write("Local: " + dateToUTC.toString());
var timeStringUTC = Date.parse(new Date(dateToUTC.toUTCString()));
document.write("<br />"); 
document.write("<br />"); 

var UTCthen = orgDate.getUTCFullYear()+"-"+(parseInt(orgDate.getUTCMonth())+1 < 10 ? "0"+(parseInt(orgDate.getUTCMonth())+1) : orgDate.getUTCMonth()+1) + "-" + (orgDate.getUTCDate() < 10 ? "0"+orgDate.getUTCDate() : orgDate.getUTCDate())+"T00:00:00.000Z"
document.write("Timestamp UTC: " + Date.parse(UTCthen) );
document.write("<br />");   
document.write("Difference (milliseconds): " + (dateParsed - Date.parse(UTCthen)) + " // = 6 hours");  //6 hours

不要通过拆分解析。只需将破折号替换为/。这将使它成为Date.parse 的有效日期。正如您在 sn-p 中看到的那样。日期以 CST 时间发送,转换为 UTC 向我们显示 London 实际上是早上六点。该示例还显示了它们之间的毫秒差异。我将解析的日期转换回它的原始 UTC 时间戳。这是在这一行中完成的:

 var UTCthen = orgDate.getUTCFullYear()+"-"+(parseInt(orgDate.getUTCMonth())+1 < 10 ? "0"+(parseInt(orgDate.getUTCMonth())+1) : orgDate.getUTCMonth()+1) + "-" + (orgDate.getUTCDate() < 10 ? "0"+orgDate.getUTCDate() : orgDate.getUTCDate())+"T00:00:00.000Z";

此行获取 UTC 日期并在其后附加时间“T00:00:00.000Z”,强制 Date.parse 认为这是一个 ISO 字符串,使用Z(祖鲁语)是 GMT/UTC 时间。

因此,在 UTCthen 上使用 Date.parse 应该可以得到时间戳的标准化版本。

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    相关资源
    最近更新 更多