从数字值创建日期时忽略时区

时间:2018-07-17 13:38:41

标签: javascript datetime

简单的例子:

new Date(2018,0,1,0,0,0,0)

产生我在(GMT + 1)所在的2017-12-31T23:00:00.000Z。我正在使用以下格式的字符串值创建日期:

YYYYMMDD HHmm
20170326 0135

这些来自ftp://ftp.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2017/的天气数据。现在,我尝试通过将小时数加一来解决超时问题,例如:new Date(2018,0,1,0+1,0,0,0)-> 2018-01-01T00:00:00.000Z

但是,如果要在午夜之前创建日期,则失败,因为例如将1加到23:30,将创建24:30,这是无效值。结果将是同一天的午夜,而不是第二天的1点:

new Date(2018,0,1,23+1,30,0,0)
2018-01-01T23:30:00.000Z

此外,由于某些原因,Date有时会减去2个小时:

new Date(2017, 2, 26, 3, 0, 0, 0);
2017-03-26T01:00:00.000Z

这个问题是-如何创建日期忽略时区,以便可以从本地日期时间字符串创建日期。

2 个答案:

答案 0 :(得分:2)

您可以使用Date.UTC函数来返回UTC时间戳:

new Date(Date.UTC(2018, 0, 1, 23, 30, 0, 0))

顺便说一下,24:30在JS日期是完全有效的。它将正确地溢出到第二天。

答案 1 :(得分:1)

接受的答案是正确的。但是在很多情况下可能有用的信息。

首先,我想说的是,如果我给2020-02-02,我不要求转换-但这正是new Date()开始的工作。而且不一致。

var date1 = new Date('2020-02-02'); //clearly assumes input is UTC!
console.error(date1.toString()); //for me, not 2020-02-02
console.error(date1.toUTCString()); //2020-02-02


var date1 = new Date('2020-02-02 13:00:00'); //clearly assumes LOCAL time 
console.error(date1.toString()); //correct for me
console.error(date1.toUTCString()); //incorrect, e.g. wrong hour

我们总是希望与UTC一起使用,除非您特别想开始将时间转换为本地时间。但是,如果您想这样做,您就会知道。通常你不会。

因此,请始终使用Date之类的date.getUTCMonth()的UTC函数,但是:输入日期也必须是UTC。否则,厄运的转换坑就开始了。

   function getDateUTC(str) {
        function getUTCDate(myDateStr){
            if(myDateStr.length <= 10){
                //const date = new Date(myDateStr); //is already assuming UTC, smart - but for browser compatibility we will add time string none the less
                const date = new Date(myDateStr.trim() + 'T00:00:00Z');
                return date;
            }else{
                throw "only date strings, not date time";
            }
        }

        function getUTCDatetime(myDateStr){
            if(myDateStr.length <= 10){
                throw "only date TIME strings, not date only";
            }else{
                return new Date(myDateStr.trim() +'Z'); //this assumes no time zone is part of the date string. Z indicates UTC time zone
            }
        }  
        
        let rv = '';
        
        if(str && str.length){
            if(str.length <= 10){
                rv = getUTCDate(str);
            }else if(str.length > 10){
                rv = getUTCDatetime(str);
            } 
        }else{
            rv = '';
        }
        return rv;
    }

console.info(getDateUTC('2020-02-02').toUTCString());

var mydateee2 = getDateUTC('2020-02-02 02:02:02');
console.info(mydateee2.toUTCString());

// you are free to use all UTC functions on date e.g.
console.info(mydateee2.getUTCHours())
console.info('all is good now if you use UTC functions')