如何将字符串转换为JavaScript日期对象?

var st = "date in some format"
var dt = new Date();

var dt_st = // st in Date format, same as dt.

当前回答

对于那些正在寻找小巧而智能的解决方案的人:

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 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}

如果你可以使用很棒的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();

字符串解析的最佳字符串格式是ISO日期格式和JavaScript date对象构造函数。

ISO格式的例子:YYYY-MM-DD或YYYY-MM-DDTHH:MM:SS。

但是等等!仅仅使用“ISO格式”本身并不能可靠地工作。字符串有时解析为UTC,有时解析为localtime(基于浏览器供应商和版本)。最佳实践应该始终是将日期存储为UTC,并以UTC进行计算。

要将日期解析为UTC,请添加Z -例如:new date ('2011-04-11T10:20:30Z')。

使用.toUTCString()显示UTC日期, 使用. tostring()以用户的本地时间显示日期。

关于MDN |日期和这个答案的更多信息。

对于旧的Internet Explorer兼容性(小于9的IE版本在日期构造函数中不支持ISO格式),您应该将日期时间字符串表示拆分为部分,然后您可以使用使用日期时间部分的构造函数,例如:new Date('2011', '04' - 1, '11', '11', '51', '00')。注意,月份的数字必须小于1。


替代方法-使用适当的库:

您还可以利用Moment.js库,该库允许使用指定的时区解析日期。

这个答案是基于卡塞姆的答案,但它也适用于两位数的年份。我对卡塞姆的答案进行了编辑,但以防它没有被批准,我还将这个作为单独的答案提交。

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 year = parseInt(dateItems[yearIndex]); 
        // adjust for 2 digit year
        if (year < 100) { year += 2000; }
        var month=parseInt(dateItems[monthIndex]);
        month-=1;
        var formatedDate = new Date(year,month,dateItems[dayIndex]);
        return formatedDate;
}

stringToDate("17/9/14","dd/MM/yyyy","/");
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")

不幸的是,我发现了

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 ());