在javascript/jquery中将UTC ISO日期解析为本地时间日期

在javascript/jquery中将UTC ISO日期解析为本地时间日期,javascript,jquery,date,parsing,iso,Javascript,Jquery,Date,Parsing,Iso,我已经试着寻找答案了,虽然我找到了非常相似的答案,但我不认为它们正是我想要的。如果其他地方已经回答了,请原谅我 我试图用javascript解析ISO日期,以便将其与客户机系统日期进行比较,并根据ISO日期是在客户机系统日期之前还是之后显示信息 在我需要支持IE8之前,这一切都很好,现在我陷入了困境 我创建了一个函数,因为我有三个不同的日期需要执行此操作 例如,我的ISO日期是:UTC时间2015-12-22T11:59 但是一旦我的日期被解析,完整的日期是当地时间的11:59,无论我测试哪个时

我已经试着寻找答案了,虽然我找到了非常相似的答案,但我不认为它们正是我想要的。如果其他地方已经回答了,请原谅我

我试图用javascript解析ISO日期,以便将其与客户机系统日期进行比较,并根据ISO日期是在客户机系统日期之前还是之后显示信息

在我需要支持IE8之前,这一切都很好,现在我陷入了困境

我创建了一个函数,因为我有三个不同的日期需要执行此操作

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

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

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

任何帮助或建议都将不胜感激。 我不能使用类似于moments.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;

简单的解决方案是在ISO日期后加上Z以表示它是UTC时间,例如2015-12-22T11:59Z

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

虽然使用new Datestr;形式的解析调用就足够简单;,它不会很好地处理针对IE8和其他旧浏览器的数字参数的解析调用

存在用于解析带时区的ISO日期的多边形填充: 在对输入字符串进行一些修改后,这可以替换自定义的parseDate函数


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

我以前曾尝试在其上附加Z,而在我编写新的Datestr时,这种方法非常有效。但这在IE8中不起作用。我预计会发生这种情况,因为您为IE8定制了解析代码。正如我在回答中所说,如果您不能使用任何库,您必须使用.getTimezoneOffset并实现自己的日期操作方法。你可以尝试用+00:00而不是Z来附加它,看看IE8是否可以将其解析为字符串,但我怀疑是否有更好的解决方案。或者,查看IE7/8 polyfill解析ISO日期:抱歉,我试图在iPad上回复,把我的评论搞乱了。我以前试着在它后面加上Z,当我在做新的Datestr时,效果非常好,并且完全满足了我的需要,但在IE8中不起作用。这就是我创建parseDate函数的原因。我知道我的函数没有使用日期部分来获取时区,我也不知道如何以一种可能发生的方式编写它,或者是否需要进行一些getTimeZoneOffset计算。但无论我需要做什么,我都不知道该写什么来实现它,我已经尝试了几个小时,在谷歌上搜索了几个小时。试着用我在前面的评论中提到的polyfill替换/增强你的自定义parseDate函数,看看它是否有效。根据polyfill中正则表达式的外观,它应该支持时区,并且应该解决您的问题。不要使用新日期…从本地值创建日期时间,请使用新日期。UTC…作为UTC值!