在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.
最佳的字符串格式用于字符串解析是日期ISO格式,结合JavaScript Date对象构造函数。
ISO格式示例:YYYY-MM-DD
或YYYY-MM-DDTHH:MM:SS
。
但是!仅仅使用“ISO格式”本身并不可靠。字符串有时会被解析为UTC时间,有时会被解析为本地时间(根据浏览器供应商和版本)。最佳实践应始终将日期存储为UTC并进行计算。
要将日期解析为UTC,请附加一个Z——例如:new Date('2011-04-11T10:20:30Z')
。
要在UTC中显示日期,请使用.toUTCString()
,
要在用户本地时间中显示日期,请使用.toString()
。
更多信息请参见MDN | Date和此答案。
为了与旧版Internet Explorer兼容(IE版本低于9不支持Date构造函数中的ISO格式),您应该将日期时间字符串表示分割为其各个部分,然后可以使用构造函数使用日期时间部分,例如:new Date('2011', '04' - 1, '11', '11', '51', '00')
。请注意,月份的数字必须减1。
替代方法-使用适当的库:
您还可以利用Moment.js库,该库允许使用指定的时区解析日期。
new Date('2011-04-11T11:51:00')
,则创建的日期是有效的。 - Pavel Hodeknew Date('1970-30-02')
是无效日期,因为一年中没有30个月。你不能溢出月份,但当你溢出天数时,在_Chrome_和_Firefox_中会解析成一个有效日期:new Date('1970-02-30')
然后与 new Date('1970-03-02')
相同。 - Pavel Hodek很不幸,我发现
var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());
返回 "Wed Apr 02 2014"。我知道这听起来很疯狂,但对于某些用户而言确实发生了这种情况。
防弹解决方案如下:
var parts ='2014-04-03'.split('-');
// Please pay attention to the month (parts[1]); JavaScript counts months from 0:
// January - 0, February - 1, etc.
var mydate = new Date(parts[0], parts[1] - 1, parts[2]);
console.log(mydate.toDateString());
var [YYYY, MM, DD] = '2014-04-03'.split('-')
。 - molexivar st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
输出结果将是:
dt => Date {Fri Apr 26 2013}
function stringToDate(_date,_format,_delimiter)
{
var formatLowerCase=_format.toLowerCase();
var formatItems=formatLowerCase.split(_delimiter);
var dateItems=_date.split(_delimiter);
var monthIndex=formatItems.indexOf("mm");
var dayIndex=formatItems.indexOf("dd");
var yearIndex=formatItems.indexOf("yyyy");
var month=parseInt(dateItems[monthIndex]);
month-=1;
var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
return formatedDate;
}
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")
.indexOf()
方法,因为它没有polyfils就不兼容跨浏览器。相反,使用更兼容的.match()
或.test()
原生JS方法。 - Alexander Dixonvar _delimiter = _format.match(/\W/g)[0];
,就可以自动获取分隔符并省略第三个参数。 - campsjosmm
代表分钟而不是月份...在你的格式中使用MM。 - vin shaba建议:我建议使用一个包含大量日期格式的日期包,因为时区和日期格式管理确实是一个很大的问题,moment.js解决了许多格式。你可以轻松地将日期从简单字符串解析为日期,但我认为支持所有日期格式和变化是一项艰巨的工作。
更新:Moment已被弃用,Moment的一个好替代品是datefns https://date-fns.org/
moment.js (http://momentjs.com/) 是一个完整且功能齐全的日期包,支持ISO 8601字符串。
你可以添加一个字符串日期和格式。
moment("12-25-1995", "MM-DD-YYYY");
你可以检查一个日期是否有效。
moment("not a real date").isValid(); //Returns false
一些显示示例
let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL'))
// output: "3 months ago | February 1, 2019"
let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL'))
的输出结果为:"3个月前 | 2019年2月1日"。 - CPHPython将其作为参数传递给 Date():
var st = "date in some format"
var dt = new Date(st);
你可以使用以下方式访问日期、月份和年份:dt.getMonth()
。
console.log(new Date('30-08-2018'))
,结果显示日期无效。 - Dwigh01/02/2020
进行操作,它会返回2月1日,而如果在美国进行相同的操作,它将返回1月2日。你几乎永远不应该使用这种天真的实现。请改用moment。 - Liam对于那些寻找小巧聪明解决方案的人:
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");
只需 new Date(st);
假设这是正确的格式。
new Date("3/2/20")
会产生什么结果呢?你认为它对我来说会产生相同的答案吗?除非我们在同一个国家,否则几乎肯定不会。就像我说的那样,这是个糟糕的想法。讽刺并不能使它变得正确。 - Julian Knightnew Date('a tomato')
一样没有有效性。ISO 8601是一个正确的格式。3/2/20
不是。 - user578895new Date(2000, 10, 1)
将会返回 "Wed Nov 01 2000 00:00:00 GMT+0100 (CET)"。
注意,月份中的0代表一月。
1644861097000
,请参阅在JavaScript中将Unix时间戳转换为时间。如果您想要将日期格式化为字符串,请参阅如何格式化JavaScript日期。 - Sebastian Simon