我的服务将此作为日期7/14/2016 2:40 AM +00:00
返回。如何在JS中将其转换为UTC?
尝试:
new Date("7/14/2016 2:40 AM +00:00").toISOString();
在数据库中,日期已存储为UTC,因此我将显示我想要显示为当地时间的日期。
答案 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