简单的例子:
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
这个问题是-如何创建日期忽略时区,以便可以从本地日期时间字符串创建日期。
答案 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')