将字符串转换为日期时间

IT技术 javascript string date datetime type-conversion
2021-02-19 20:01:49

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

6个回答

保持简单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


编辑: “代码不同”留下了一个有value的评论,由于浏览器的差异,MDN 不再建议使用 Date 作为这样的构造函数。虽然上面的代码在 Chrome (v87.0.x) 和 Edge (v87.0.x) 中运行良好,但它在 Firefox (v84.0.2) 中给出了“无效日期”错误。

解决此问题的一种方法是确保您的字符串采用更通用的格式 YYYY-MM-DD(强制 xkcd),例如const s = '1970-01-01 00:03:44';,这似乎适用于三个主要浏览器,但这并不能完全回答原始问题。

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

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

[编辑] 添加了一个 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>

您可以使用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 会怎样?
2021-04-17 20:01:49
支持所有这些:)
2021-05-10 20:01:49

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

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

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

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