将字符串转换为日期时间

Posted

技术标签:

【中文标题】将字符串转换为日期时间【英文标题】:Convert string to datetime 【发布时间】:2011-07-27 12:06:06 【问题描述】:

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

【问题讨论】:

***.com/questions/476105/…的可能重复 您的问题似乎与此问题重复:***.com/q/476105/684934 请检查这个; ***.com/a/25961926/1766100 它对我有用。 【参考方案1】:

使用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/en-US/docs/Web/javascript/Reference/Global_Objects/Date


编辑:“代码不同”留下了一条有价值的评论,由于浏览器的差异,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';,这似乎适用于三种主要浏览器,但是这并不能完全回答最初的问题。

【讨论】:

为什么这不是选择的答案?这可能是这里最直观的答案。 不在 safari 上。使用此字符串格式执行此操作会导致日期无效 有关 safari 问题的更多信息:***.com/questions/4310953/invalid-date-in-safari 如果可能,我建议您使用已接受答案中引用的日期字符串格式。希望 Safari 最终会符合标准。同时,如果这对您来说是个问题,可能需要一个额外的库。 不要使用这种方法。日期时间格式是特定于浏览器的。来自MDN:“注意:由于浏览器的差异和不一致,强烈建议不要使用Date 构造函数(和Date.parse(),其工作方式相同)解析日期字符串。”【参考方案2】:

对于这种格式(假设 datepart 的格式为 dd-mm-yyyy),在纯 javascript 中使用 dateString2Date

[Edit] 添加了一个 ES6 实用方法来使用格式字符串参数 (format) 解析日期字符串,以告知该方法输入字符串中日期/月份/年份的位置.

var 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\ntryParseDateFromString('01-01-2016 00:03:44', 'dmy'):\n => $
  tryParseDateFromString('01-01-2016 00:03:44', "dmy").toUTCString()`;

result.textContent += 
  `\n\nWith formatting\ntryParseDateFromString('03/01/2016', 'mdy'):\n => $
  tryParseDateFromString('03/01/1943', "mdy").toUTCString()`;

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


// multiple formats (e.g. yyyy/mm/dd or mm-dd-yyyy etc.)
function tryParseDateFromString(dateStringCandidateValue, format = "ymd") 
  if (!dateStringCandidateValue)  return null; 
  let mapFormat = format
          .split("")
          .reduce(function (a, b, i)  a[b] = i; return a;, );
  const dateStr2Array = dateStringCandidateValue.split(/[ :\-\/]/g);
  const datePart = dateStr2Array.slice(0, 3);
  let datePartFormatted = [
          +datePart[mapFormat.y],
          +datePart[mapFormat.m]-1,
          +datePart[mapFormat.d] ];
  if (dateStr2Array.length > 3) 
      dateStr2Array.slice(3).forEach(t => datePartFormatted.push(+t));
  
  // test date validity according to given [format]
  const dateTrial = new Date(Date.UTC.apply(null, datePartFormatted));
  return dateTrial && dateTrial.getFullYear() === datePartFormatted[0] &&
         dateTrial.getMonth() === datePartFormatted[1] &&
         dateTrial.getDate() === datePartFormatted[2]
            ? dateTrial :
            null;
<pre id="result"></pre>

【讨论】:

【参考方案3】:

您可以使用moment.js 库。

那么简单:

var stringDate = '01-01-1970 00:03:44';
var momentDateObj = moment(stringDate);

还可以查看他们的 api,帮助格式化、添加、减去(天、月、年、其他时刻对象)。

我希望这会有所帮助。

里斯

【讨论】:

你怎么知道你的 stringDate 的结构是 dd-mm 而不是 mm-dd 你的答案?如果中文浏览器的本地设置将 01-01-1970 称为 mm-dd-yyyy 而另一个浏览器在另一个位置是 dd-mm-yyyy,该怎么办? 支持所有这些:)【参考方案4】:

http://www.w3schools.com/jsref/jsref_parse.asp

    <script type="text/javascript">
        var d = Date.parse("Jul 8, 2005");
        document.write(d);<br>
    </script>

【讨论】:

【参考方案5】:

好吧,我想我应该提到一个我通过一些尝试遇到的解决方案。在修复某人将日期作为字符串比较的缺陷时发现。

新日期(Date.parse('01-01-1970 01:03:44'))

【讨论】:

【参考方案6】:
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;
    

【讨论】:

【参考方案7】:

https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

var unixTimeZero = Date.parse('01 Jan 1970 00:00:00 GMT');
var javaScriptRelease = Date.parse('04 Dec 1995 00:12:00 GMT');

console.log(unixTimeZero);
// expected output: 0

console.log(javaScriptRelease);
// expected output: 818035920000

【讨论】:

【参考方案8】:

通过使用Date.parse(),您可以获得 unix 时间戳

date = new Date( Date.parse("05/01/2020") )
//Fri May 01 2020 00:00:00 GMT

【讨论】:

【参考方案9】:

对于纯 javascript 中的这种格式(假设 datepart 的格式为 dd-mm-yyyy):

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

【讨论】:

【参考方案10】:

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())
在此处输入代码

【讨论】:

一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。

以上是关于将字符串转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章

无法将字符串转换为日期和日期转换为字符串 Swift 5.2

将日期时间转换为字符串 PHP

将字符串日期时间转换为熊猫日期时间

Python将日期时间字符串转换为日期

将 JSON 日期字符串转换为 Python 日期时间

将日期字符串转换为正确的格式