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
。但是,ECMAScript规范中只需要ISO8601格式。任何其他输入都是特定于实现的,不同的JavaScript运行时可能会识别,也可能不会识别。特别是对于web浏览器,不同浏览器支持的格式有很多差异 此外,环境的区域设置在值的解析方式中起着重要作用。应如何解析2016年1月2日的Date.parse
?一月二号,还是二月一号?您展示了一个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
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