在尝试创建日期时,将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提供给构造函数的初始化。
答案 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)}`));