timeStamp param to Date构造函数中的时区导致“无效日期”错误

时间:2018-02-02 06:38:03

标签: javascript node.js

在尝试创建日期时,将timeStamp提供给Date()构造函数(下面的代码段) - 第一次调用有效但第二次调用会在指定时区时抛出(“无效日期”)错误 - 如何更正?

var date1 = new Date('Dec 17, 1995 03:24:00 AM EST'); //<---- THIS WORKS!!!
console.log(date1)
// Sun Dec 17 1995 03:24:00 GMT...

var date2 = new Date('1995-12-17T03:24:00 EST'); //<---- THIS DOES NOT WORK!!!
console.log(date2)

输出:

> Sun Dec 17 1995 13:54:00 GMT+0530 (India Standard Time)
> Invalid Date
> false
> NaN

这不是一个重复的问题,因为对于建议的重复问题,请求从timeStamp提供给构造函数的初始化。

2 个答案:

答案 0 :(得分:2)

您在参数中提供了错误的格式。

new Date('1995-12-17T03:24:00 EST');

出了什么问题

您在日期构造函数中提供的格式标准称为ISO_8601。根据标准,你不能像你那样提供时区偏移。

正确的方式

如果描述的时间比UTC早一个小时(例如冬季柏林的时间),则区域指示符将为“+01:00”;

new Date('1995-12-17T03:24:00+01:00');

如果描述的时间比UTC晚一个小时,则区域指示符将为“+01:00”;

new Date('1995-12-17T03:24:00-01:00');

以下所有内容均指同时"18:30Z", "22:30+04", "1130−0700", and "15:00−03:30".

答案 1 :(得分:0)

此代码不能解决直接为时区添加时间戳的问题,但提供了支持首选时区的替代方法,以及创建js可接受的时间戳,动态转换数字月份名称。这只是对建议的粗略解决方案。

function getTZId(zone) {
    var retId = zone;
    if (zone) {
        //placeholder to maintain / add new zone id patterns
        //a word of caution: some timezones are not supported so offset will be required
        var zoneIds = {
            'EST':[/ET/,/EST/,/EAST/,/OTT/],
            'UTC+5:30':[/IST/,/IND/,/GURG/],
            'CST':[/CENTR/,/NA/],
            'UTC':[/UTC/,/GMT/,/ZULU/,/Z/,/GREEN/]
        }
        //default zone id
        var defZnId = 'UTC';
        var fnd = _.findIndex (
            Object.keys( zoneIds ),
            //lookup all zone id's for a match among respective zone patterns till first matching zone id is found
            znId => {
                return (                
                    _.findIndex (
                        zoneIds[znId],
                        //match each zone pattern for this zone id till the first match is found
                        znPtrn=>{
                            return znPtrn.test( zone.toUpperCase() )
                        }
                    ) !== -1
                )
            }
        );
        //return zone id if matching zone id found else return default zone id: 'UTC'
        retId = (fnd!==-1?Object.keys( zoneIds )[fnd]:defZnId);
    }
    return retId;
}

var yr = "2018", mn = "2", dy = "28", hr = "14", min = "05";
var timezone = "EST";

//get date components for current timezone like month names etc
var tmpDt = (new Date(`${yr}-${mn}-${dy}T${hr}:${min}`)).toDateString().match(/^([A-Za-z]+)\s+([A-Za-z]+)\s+(\d+)\s+(\d+)$/i);

//use above code to create appropriate time stamp
return (new Date(`${tmpDt[2]} ${tmpDt[3]}, ${yr} ${hr}:${min}:00 ${getTZId(tmZoneStr)}`));