繁体   English   中英

date构造函数的timeStamp参数中的时区导致“无效日期”错误

[英]Time Zone in timeStamp param to Date constructor leads to 'invalid date' error

尝试创建将时间戳记提供给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初始化给构造函数。

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

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".

这段代码并不能解决直接为时区添加时间戳的问题,但提供了一种替代方法,可以支持首选时区以及创建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)}`));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM