如何将字符串转换为JavaScript日期对象?
var st = "date in some format"
var dt = new Date();
var dt_st = // st in Date format, same as dt.
如何将字符串转换为JavaScript日期对象?
var st = "date in some format"
var dt = new Date();
var dt_st = // st in Date format, same as dt.
当前回答
如果你可以使用很棒的luxon库,你可以很容易地解析你的日期。
var luxonDate = DateTime.fromISO("2014-09-15T09:00:00");
和可以访问JS date对象通过
luxonDate().toJSDate();
旧的答案使用的是MomentJS
var momentDate = moment("2014-09-15 09:00:00");
momentDate ().toDate();
其他回答
性能
今天(2020.05.08),我对所选解决方案进行了测试-有两种情况:输入日期是ISO8601字符串(Ad,Bd,Cd,Dd,Ed),输入日期是时间戳(At, Ct, Dt)。解决方案Bd,Cd,Ct不返回js Date对象作为结果,但我添加它们,因为它们可能是有用的,但我没有将它们与有效的解决方案进行比较。该结果对于大量数据解析非常有用。
结论
解决方案new Date (Ad)比moment.js (Dd)快50-100倍,适用于所有浏览器的ISO日期和时间戳 解决方案new Date (Ad)比parseDate (Ed)快10倍 解决方案date .parse(Bd)是最快的,如果我们需要在所有浏览器上从ISO日期获得时间戳
细节
我在MacOs High Sierra 10.13.6、Chrome 81.0、Safari 13.1、Firefox 75.0上进行测试。解决方案parseDate (Ed)使用新的Date(0)和手动设置UTC日期组件。
let ds = '2020-05-14T00:00Z'; // Valid ISO8601 UTC date let ts = +'1589328000000'; // timestamp let Ad = new Date(ds); let Bd = Date.parse(ds); let Cd = moment(ds); let Dd = moment(ds).toDate(); let Ed = parseDate(ds); let At = new Date(ts); let Ct = moment(ts); let Dt = moment(ts).toDate(); log = (n,d) => console.log(`${n}: ${+d} ${d}`); console.log('from date string:', ds) log('Ad', Ad); log('Bd', Bd); log('Cd', Cd); log('Dd', Dd); log('Ed', Ed); console.log('from timestamp:', ts) log('At', At); log('Ct', Ct); log('Dt', Dt); function parseDate(dateStr) { let [year,month,day] = dateStr.split(' ')[0].split('-'); let d=new Date(0); d.setUTCFullYear(year); d.setUTCMonth(month-1); d.setUTCDate(day) return d; } <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment-with-locales.min.js"></script> This snippet only presents used soultions
铬检测结果
还有另一种方式:
String.prototype.toDate = function(format) {
format = format || "dmy";
var separator = this.match(/[^0-9]/)[0];
var components = this.split(separator);
var day, month, year;
for (var key in format) {
var fmt_value = format[key];
var value = components[key];
switch (fmt_value) {
case "d":
day = parseInt(value);
break;
case "m":
month = parseInt(value)-1;
break;
case "y":
year = parseInt(value);
}
}
return new Date(year, month, day);
};
a = "3/2/2017";
console.log(a.toDate("dmy"));
// Date 2017-02-03T00:00:00.000Z
对于那些正在寻找小巧而智能的解决方案的人:
String.prototype.toDate = function(format)
{
var normalized = this.replace(/[^a-zA-Z0-9]/g, '-');
var normalizedFormat= format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');
var formatItems = normalizedFormat.split('-');
var dateItems = normalized.split('-');
var monthIndex = formatItems.indexOf("mm");
var dayIndex = formatItems.indexOf("dd");
var yearIndex = formatItems.indexOf("yyyy");
var hourIndex = formatItems.indexOf("hh");
var minutesIndex = formatItems.indexOf("ii");
var secondsIndex = formatItems.indexOf("ss");
var today = new Date();
var year = yearIndex>-1 ? dateItems[yearIndex] : today.getFullYear();
var month = monthIndex>-1 ? dateItems[monthIndex]-1 : today.getMonth()-1;
var day = dayIndex>-1 ? dateItems[dayIndex] : today.getDate();
var hour = hourIndex>-1 ? dateItems[hourIndex] : today.getHours();
var minute = minutesIndex>-1 ? dateItems[minutesIndex] : today.getMinutes();
var second = secondsIndex>-1 ? dateItems[secondsIndex] : today.getSeconds();
return new Date(year,month,day,hour,minute,second);
};
例子:
"22/03/2016 14:03:01".toDate("dd/mm/yyyy hh:ii:ss");
"2016-03-29 18:30:00".toDate("yyyy-mm-dd hh:ii:ss");
不幸的是,我发现了
var mydate =新日期(2014-04-03); 游戏机。log (mydate toDateString ());
返回“2014年4月2日星期三”。我知道这听起来很疯狂,但这确实发生在一些用户身上。
防弹方案如下:
Var parts ='2014-04-03'.split('-'); //请关注月份(零件[1]);JavaScript从0开始计算月份: // 1月- 0日,2月- 1日,等等。 var mydate =新的日期(部分[0],部分[1]- 1,部分[2]); console.log (mydate.toDateString ());
我已经创建了parseDateTime函数将字符串转换为日期对象,它在所有浏览器(包括IE浏览器)中工作,检查是否有人需要,引用 https://github.com/Umesh-Markande/Parse-String-to-Date-in-all-browser
function parseDateTime(datetime) {
var monthNames = [
"January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December"
];
if(datetime.split(' ').length == 3){
var date = datetime.split(' ')[0];
var time = datetime.split(' ')[1].replace('.00','');
var timearray = time.split(':');
var hours = parseInt(time.split(':')[0]);
var format = datetime.split(' ')[2];
var bits = date.split(/\D/);
date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
if ((format === 'PM' || format === 'pm') && hours !== 12) {
hours += 12;
try{ time = hours+':'+timearray[1]+':'+timearray[2] }catch(e){ time = hours+':'+timearray[1] }
}
var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + ' ' + year + ' ' + time);
return formateddatetime;
}else if(datetime.split(' ').length == 2){
var date = datetime.split(' ')[0];
var time = datetime.split(' ')[1];
var bits = date.split(/\D/);
var datetimevalue = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
var day = datetimevalue.getDate();
var monthIndex = datetimevalue.getMonth();
var year = datetimevalue.getFullYear();
var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + ' ' + year + ' ' + time);
return formateddatetime;
}else if(datetime != ''){
var bits = datetime.split(/\D/);
var date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
return date;
}
return datetime;
}
var date1 = '2018-05-14 05:04:22 AM'; // yyyy-mm-dd hh:mm:ss A
var date2 = '2018/05/14 05:04:22 AM'; // yyyy/mm/dd hh:mm:ss A
var date3 = '2018/05/04'; // yyyy/mm/dd
var date4 = '2018-05-04'; // yyyy-mm-dd
var date5 = '2018-05-14 15:04:22'; // yyyy-mm-dd HH:mm:ss
var date6 = '2018/05/14 14:04:22'; // yyyy/mm/dd HH:mm:ss
console.log(parseDateTime(date1))
console.log(parseDateTime(date2))
console.log(parseDateTime(date3))
console.log(parseDateTime(date4))
console.log(parseDateTime(date5))
console.log(parseDateTime(date6))
**Output---**
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Mon May 14 2018 15:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 14:04:22 GMT+0530 (India Standard Time)