[英]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.