Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中字符串到日期的转换_Javascript_Json_Date_Datetime_Utc - Fatal编程技术网

JavaScript中字符串到日期的转换

JavaScript中字符串到日期的转换,javascript,json,date,datetime,utc,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,因此当我将要显示的日期显示为本地时间时。假设您可以保证所有日期的格式,以下代码就足够了: const datetime = '7/14/2016 2:40 PM +00:00'; // this is what your service returns

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

尝试:

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

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

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

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点/下午12点等,但也可以轻松解决

EDIT2:解释了那个边缘案例


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

有许多方法可以解析字符串以生成
日期
对象

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

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

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

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

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

    下面是使用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
    

你想得太多了……你以前试过吗?@AlonEitan为什么每个人在每个问题中都提到这一点?添加一个重量为12+kb gzip的复杂库来解析日期字符串有点过分。@JaredSmith只是因为它有助于更轻松地处理日期方面的内容,以及12+kb gzip的内容(如果您使用的是精简版本,可能会更少)当你的网站充满了图片和其他visuals@JaredSmith我完全同意——这基本上取决于你需要多久操纵一次日期,以及这项任务有多复杂。我认为它就像
jQuery
(或者angularjs和其他类似的框架)-您可以使用它进行复杂的DOM操作,但是当您只需要
document.getElementById()
时,您不必使用它。除了
+00:00
之外,这不考虑任何偏移量。上午12点/下午几乎不是“边缘”情况。在一个均匀分布的随机样本中,大约有8%的时间会发生这种情况。如果你真的想争论我对边缘情况的定义,那就去吧(:我已经编辑了答案来解释它,所以在这一点上有点没有意义…@MattJohnson,是的,我假设OP从示例开始就以UTC接收字符串。如果时间可以有任何偏移,我的答案将不起作用。我添加了一个澄清,以便人们知道如果他们阅读我的答案,它只适用于UTC。@michel我尝试用UTC替换,然后将其转换为新日期,这在IE中也适用。我尝试了您提供的解决方案,但这在IE中引发了错误。
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