JavaScript 中的字符串到日期转换

String to Date conversion in JavaScript

本文关键字:日期 转换 字符串 JavaScript      更新时间:2023-09-26

我的服务将其作为日期返回7/14/2016 2:40 AM +00:00。如何在 JS 中将其转换为 UTC?

试:

new Date("7/14/2016 2:40 AM +00:00").toISOString();

在数据库中,日期已存储为 UTC,因此何时将显示要显示为本地时间的日期。

有许多

方法可以解析字符串以生成Date对象。

  • 一种方法是使用 Date 对象本身,方法是将字符串传递给构造函数,或使用 Date.parse 。 但是,在 ECMAScript 规范中只需要ISO8601格式。 任何其他输入都是特定于实现的,并且可能会也可能不会被不同的 JavaScript 运行时识别。特别是对于 Web 浏览器,不同浏览器支持的格式存在许多差异。

    此外,环境的区域设置在如何分析值方面起着重要作用。 应该如何解析1/2/2016?1月2日,还是2月1日? 您展示了一个 7/14/2016 的示例,如果在英国运行(例如),则输入无效,其中日期格式为 DD/MM/YYYY

  • 可以编写自定义代码以将字符串拆分为其部分,单独分析每个部分,并撰写结果。 这种方法的主要问题是代码往往是僵化的,有时甚至是脆弱的。 它应该经过良好的测试,并且需要考虑许多边缘情况。

  • 您可以使用库,这是迄今为止最简单,最灵活的方法(恕我直言)。 有了好的库,你可以从其他人的共享经验中得到安慰,也可以在单元测试中得到安慰,这些单元测试(希望)是你选择的库的一部分。 当然,使用库有几个权衡,包括增加文件大小和放弃一定程度的控制。 您应该仔细评估这些权衡。

    有许多日期库可用于 JavaScript。 最受欢迎的可能是moment.js,尽管还有其他可供选择,一些较大的框架有时已经包含类似的功能。

    下面是一个使用 moment.js 的示例:

    var i = "7/14/2016 2:40 AM +00:00";
    var f = "M/D/YYYY h:mm A Z";
    var m = moment(i, f);
    var o = m.format(f); // will be in the local time, in the same format as the input
    var d = m.toDate();  // if you really want a Date object
    

假设您可以保证所有日期的格式,以下代码就足够了:

const datetime = '7/14/2016 2:40 PM +00:00'; // this is what your service returns
const pieces = datetime.split(/[/: ]/);
if (pieces[3] == 12) pieces[3] = 0; // fixes edge case for 12 AM/PM
const hours = pieces[5] === 'PM' ? Number(pieces[3]) + 12 : pieces[3];
const d = new Date(Date.UTC(pieces[2], pieces[0] - 1, pieces[1], hours, pieces[4]));
console.log(datetime); // prints "7/14/2016 2:40 PM +00:00"
console.log(d); // prints Date 2016-07-14T14:40:00.000Z

编辑:有几个边缘情况没有得到正确处理,即12 AM/PM等,但这些也可以很容易地解决。

编辑2:考虑了该边缘情况。

编辑3:正如评论所述,这仅适用于UTC时间。 如果您收到的字符串可以有任何偏移量,这将不起作用。

var str = "7'/15'/2016 1:00 AM +00:00".replace("+00:00","UTC");
console.log(new Date(str).toISOString()); // 2016-07-15T01:00:00.000Z