将字符串转换为日期时间

69

如何将类似于 '01-01-1970 00:03:44' 的字符串转换为日期时间格式?


可能是 https://dev59.com/THRB5IYBdhLWcg3w4bOv 的重复问题,如何在 JavaScript 中使用格式规范将字符串转换为日期时间? - S L
你的问题似乎是这个的重复:https://dev59.com/THRB5IYBdhLWcg3w4bOv - user684934
请查看这个链接:https://dev59.com/PW035IYBdhLWcg3wHsKR#25961926 它对我有用。 - Fatih Çelik
12个回答

127

使用new Date(string)保持简单。 这应该就可以了...

const s = '01-01-1970 00:03:44';
const d = new Date(s);
console.log(d); // ---> Thu Jan 01 1970 00:03:44 GMT-0500 (Eastern Standard Time)

参考资料: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date


编辑: “Code Different” 留下了一条宝贵的评论,指出由于浏览器之间的差异,MDN不再建议像这样使用 Date 构造函数。虽然上面的代码在 Chrome(v87.0.x)和 Edge(v87.0.x)中运行良好,但在 Firefox(v84.0.2)中会出现“无效日期”的错误信息。

解决这个问题的一种方法是确保您的字符串采用更通用的 YYYY-MM-DD 格式(obligatory xkcd),例如,const s = '1970-01-01 00:03:44';,这似乎在三大主流浏览器中都可以工作,但这并不完全回答原始问题。


10
为什么这不是被选中的答案?这可能是这里最直观的答案。 - hlin117
1
不适用于Safari浏览器。使用此字符串格式会导致无效日期。 - yeahdixon
更多有关Safari问题的信息:https://dev59.com/t2855IYBdhLWcg3wfUZM 当可能时,我建议您使用被接受答案中引用的日期字符串格式。希望Safari最终能够符合标准。同时,如果这对您造成了问题,可能需要使用额外的库。 - Luke
2
不要使用这种方法。日期时间格式因浏览器而异。来自MDN的说明:“注意:强烈不建议使用Date构造函数(以及同样工作方式的Date.parse())解析日期字符串,因为浏览器之间存在差异和不一致性。” - Code Different

19
对于这种格式(假设datepart的格式为dd-mm-yyyy),在纯JavaScript中使用 dateString2Date 方法进行转换。但要注意浏览器兼容性问题可能会影响其正常使用。

tryParseDateFromString 是一个 ES6 的实用工具方法,用于解析带有格式字符串参数(format)的日期字符串,并使用 Date.UTC 构造日期,以规避前面提到的浏览器兼容性问题。

另请参阅

// fixed format dd-mm-yyyy
function dateString2Date(dateString) {
  const dt = dateString.split(/\-|\s/);
  return new Date(dt.slice(0, 3).reverse().join('-') + ' ' + dt[3]);
}

// multiple formats (e.g. yyyy/mm/dd (ymd) or mm-dd-yyyy (mdy) etc.)
function tryParseDateFromString(dateStringCandidateValue, format = "ymd") {
  const candidate = (dateStringCandidateValue || ``)
    .split(/[ :\-\/]/g).map(Number).filter(v => !isNaN(v));
  const toDate = () => {
    format = [...format].reduce((acc, val, i) => ({ ...acc,  [val]: i }), {});
    const parts = 
      [candidate[format.y], candidate[format.m] - 1, candidate[format.d] ]
        .concat(candidate.length > 3 ? candidate.slice(3) : []);
    const checkDate = d => d.getDate && 
      ![d.getFullYear(), d.getMonth(), d.getDate()]
        .find( (v, i) => v !== parts[i] ) && d || undefined;
    
    return checkDate( new Date(Date.UTC(...parts)) );
  };

  return candidate.length < 3 ? undefined : toDate();
}

const result = document.querySelector('#result');

result.textContent =
  `*Fixed\ndateString2Date('01-01-2016 00:03:44'):\n => ${
    dateString2Date('01-01-2016 00:03:44')}`;

result.textContent +=
  `\n\n*With formatting dmy
tryParseDateFromString('01-12-2016 00:03:44', 'dmy'):\n => ${
tryParseDateFromString('01-12-2016 00:03:44', "dmy").toUTCString()}`;

result.textContent +=
  `\n\n*With formatting mdy
tryParseDateFromString('03/01/1943', 'mdy'):\n => ${
tryParseDateFromString('03/01/1943', "mdy").toUTCString()}`;

result.textContent +=
  `\n\n*With invalid format
tryParseDateFromString('12-13-2016 00:03:44', 'dmy'):\n => ${
tryParseDateFromString('12-13-2016 00:03:44', "dmy")}`;


result.textContent +=
  `\n\n*With formatting invalid string
tryParseDateFromString('03/01/null', 'mdy'):\n => ${
tryParseDateFromString('03/01/null', "mdy")}`;

result.textContent +=
  `\n\n*With formatting no parameters
tryParseDateFromString():\n => ${tryParseDateFromString()}`;
<pre id="result"></pre>


8
您可以使用 moment.js 库。
然后简单地:
var stringDate = '01-01-1970 00:03:44';
var momentDateObj = moment(stringDate);

还要查看他们的API,有助于格式化、添加、减去日期(天、月、年、其他时刻对象)。

希望这可以帮到您。

Rhys


1
你如何确定你的stringDate是以dd-mm的结构而不是mm-dd?如果一个中国浏览器的本地设置将01-01-1970表示为mm-dd-yyyy,而另一个浏览器在另一个位置则是dd-mm-yyyy呢? - themhz
支持它们的所有功能 :) - Rhys Bradbury

8

4

我认为我应该提及一个解决方案,这是我在尝试中发现的。当修复某个人将日期比较为字符串时发现了它。

new Date(Date.parse('01-01-1970 01:03:44'))


3

2
formatDateTime(sDate,FormatType) {
    var lDate = new Date(sDate)

    var month=new Array(12);
    month[0]="January";
    month[1]="February";
    month[2]="March";
    month[3]="April";
    month[4]="May";
    month[5]="June";
    month[6]="July";
    month[7]="August";
    month[8]="September";
    month[9]="October";
    month[10]="November";
    month[11]="December";

    var weekday=new Array(7);
    weekday[0]="Sunday";
    weekday[1]="Monday";
    weekday[2]="Tuesday";
    weekday[3]="Wednesday";
    weekday[4]="Thursday";
    weekday[5]="Friday";
    weekday[6]="Saturday";

    var hh = lDate.getHours() < 10 ? '0' + 
        lDate.getHours() : lDate.getHours();
    var mi = lDate.getMinutes() < 10 ? '0' + 
        lDate.getMinutes() : lDate.getMinutes();
    var ss = lDate.getSeconds() < 10 ? '0' + 
        lDate.getSeconds() : lDate.getSeconds();

    var d = lDate.getDate();
    var dd = d < 10 ? '0' + d : d;
    var yyyy = lDate.getFullYear();
    var mon = eval(lDate.getMonth()+1);
    var mm = (mon<10?'0'+mon:mon);
    var monthName=month[lDate.getMonth()];
    var weekdayName=weekday[lDate.getDay()];

    if(FormatType==1) {
       return mm+'/'+dd+'/'+yyyy+' '+hh+':'+mi;
    } else if(FormatType==2) {
       return weekdayName+', '+monthName+' '+ 
            dd +', ' + yyyy;
    } else if(FormatType==3) {
       return mm+'/'+dd+'/'+yyyy; 
    } else if(FormatType==4) {
       var dd1 = lDate.getDate();    
       return dd1+'-'+Left(monthName,3)+'-'+yyyy;    
    } else if(FormatType==5) {
        return mm+'/'+dd+'/'+yyyy+' '+hh+':'+mi+':'+ss;
    } else if(FormatType == 6) {
        return mon + '/' + d + '/' + yyyy + ' ' + 
            hh + ':' + mi + ':' + ss;
    } else if(FormatType == 7) {
        return  dd + '-' + monthName.substring(0,3) + 
            '-' + yyyy + ' ' + hh + ':' + mi + ':' + ss;
    }
}

1

For this format (supposed datepart has the format dd-mm-yyyy) in plain javascript:

var dt  = '01-01-1970 00:03:44'.split(/\-|\s/)
    dat = new Date(dt.slice(0,3).reverse().join('/')+' '+dt[3]);


1
通过使用Date.parse(),您可以获得Unix时间戳。
date = new Date( Date.parse("05/01/2020") )
//Fri May 01 2020 00:00:00 GMT

1

var dt  = '01-02-2021 12:22:55'.split(/\-|\s/)
    dat = new Date(dt.slice(0,3).reverse().join('/')+' '+dt[3]);
console.log(dat.toLocaleDateString())


2
通常情况下,如果答案包含代码的意图和解决问题的原因,而不会引入其他问题,那么这些答案会更有帮助。 - 0xLogN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接