在UTC / jquery

时间:2015-10-22 18:16:19

标签: javascript jquery date parsing iso

我已经尝试过搜索答案,虽然我找到的答案非常相似,但我认为它们并不是我想要的。如果已在其他地方得到解答,请原谅我。

我正在尝试在javascript中解析ISO日期,以便我可以将其与客户端系统日期进行比较,并根据ISO日期是在客户端系统日期之前还是之后显示信息。

这很好,直到我需要支持IE8,现在我被卡住了。

我创建了一个函数,因为我有三个不同的日期需要这样做。

例如,我的ISO日期是:2015-12-22T11:59 UTC时间。

但是一旦我的日期被解析,完整的日期是当地时间的11:59,无论我测试哪个时区,它在该时区总是11.59。

我知道我目前创建的功能对时区没有任何作用,这就是我被困住的地方。我不知道要添加什么来改变我的结束日期以反映客户端机器的时区。

任何帮助或建议将不胜感激。 我无法使用像moment.js这样的东西,因为我有上传限制。

Jquery可用。或纯粹的JavaScript。

<script>
function setSaleContent() {


    //creating a new date object that takes the clients current system time. so we can compare it to the dates stored in our array
    var currentDate = new Date();
    console.log(currentDate + " this is the clients date ");


    //These variables actually come from an external array object, but I'm putting them in here like this for this example. 
    var destinations = {
        freedate: "2015-12-16T11:59",  
        courierdate: "2015-12-22T11:59",
        nextdaydate: "2015-12-23T11:59",
    }

    //fetch all the ISO dates from the array. 
    var freeDateISO = destinations["freedate"];
    var courierDateISO = destinations["courierdate"];
    var nextdayDateISO = destinations["nextdaydate"];


    //I am creating this reusable function to split up my ISO date for the sake of IE8.. and create it into a date format that can be compared against another date.  I know that this isn't doing anything with my timezone and that is where my problem lies. 
    function parseDate(str) {
        var parts = /^(\d{4}).(\d{2}).(\d{2}).(\d{2}):(\d{2})/.exec(str);
        if (parts) {
            return new Date(parts[1], parts[2] - 1, parts[3], parts[4], parts[5]);
        }
        return new Date();
    }


    //I would like this date to change to reflect the time zone of the clients system time. 
    //currently returns the date at 11.59 regardless of timezone. 
    //If i was in GMT  i would want it to say 11.59
    //If i was in CT time I would like this to say 05.59
    //If i was in Perth I would like this to say  19:59
    var freeDate = parseDate(freeDateISO);
    console.log(freeDate + " this is the converted date for IE")





}


window.onload = setSaleContent;

1 个答案:

答案 0 :(得分:0)

简单的解决方案是将Z附加到ISO日期以表明它处于UTC时间,例如2015-12-22T11:59Z

当JavaScript将该日期解析为字符串时,它会自动将UTC日期转换为本地时区。

虽然这对于new Date(str);形式的解析调用来说很简单,但是对于使用针对IE8和其他旧浏览器的数字参数的解析调用,它不会很好。

存在用于解析带有时区的ISO日期的polyfill:Javascript JSON Date parse in IE7/IE8 returns NaN
这可以在进行一些修改后替换您的自定义parseDate函数以获取输入字符串。

或者,在新创建的日期使用.getTimezoneOffset()方法实现您自己的自定义日期操作符以计算本地时区,这会以分钟为单位给出时区偏移量,但您必须提供一种方法利用偏移量,例如调整小时和分钟,由于JavaScript日期对象的方法有限。