JavaScript中的字符串到日期转换

时间:2016-07-14 20:29:51

标签: javascript json date datetime utc

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

尝试:

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

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

3 个答案:

答案 0 :(得分:1)

有很多方法可以解析字符串以生成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
    

答案 1 :(得分:0)

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

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点/下午等,但这些也很容易解决。

EDIT2:占优势。

EDIT3:正如评论所述,这仅适用于UTC时间。如果您收到的字符串可以有任何偏移量,则无效。

答案 2 :(得分:0)

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