Javascript 时区解析地狱
我有这个ISO日期:Javascript 时区解析地狱,javascript,momentjs,Javascript,Momentjs,我有这个ISO日期: var v = '2013-07-09T13:27:29.000Z'; 如果我这样做: var g = moment(v).format(); Console将g值作为正确的本地时间提供给我2013-07-08T17:25:08-03:00 但如果我这么做是为了让时间早一点: console.log(moment(g).startOf('day').fromNow()); 矩使用原始的v ISO而不是格式化的g来计算时间 为什么? 编辑:我已经测试了另一个时间插件(j
var v = '2013-07-09T13:27:29.000Z';
如果我这样做:
var g = moment(v).format();
Console将g值作为正确的本地时间提供给我2013-07-08T17:25:08-03:00
但如果我这么做是为了让时间早一点:
console.log(moment(g).startOf('day').fromNow());
矩使用原始的v ISO而不是格式化的g来计算时间
为什么?
编辑:我已经测试了另一个时间插件(jquery.timeago),当传递原始v值时,解析本地时间也会发生同样的错误
我做错了什么?这段代码是在客户端执行的,所以所有插件都应该为用户返回正确的本地时间
编辑2:有关我正在尝试做什么的更多相关信息:
var v = notifs.ntime; //2013-07-09T13:27:29.000Z
var m = moment(v).zone(v).format(); // 2013-07-09T13:27:29+00:00 (wrong local)
var m2 = moment(v).format(); // 2013-07-09 10:27:29 (correct local)
var r = moment(v).zone(v).startOf('day').fromNow() // 21 hours ago (wrong)
var r2 = moment(v).startOf('day').fromNow() // 18 hours ago (wrong)
console.log(v);
console.log(m);
console.log(m2);
console.log(r);
console.log(r2);
console.log('-------------------');
/*
2013-07-09T13:27:29.000Z
2013-07-09T13:27:29+00:00
2013-07-09T10:27:29-03:00
21 hours ago
18 hours ago
-------------------
I expected "8 hours ago" as now is 18:10 and (v) was set on 10:27 (m2)
*/
我不太确定我是否明白你在找什么 通过使用
g
变量,您基本上做到了这一点:
moment(moment(v).format()).startOf('day').fromNow()
这有点多余。与此完全相同:
moment(v).startOf('day').fromNow()
这将告诉你从现在到当地一天开始的时间间隔
如果您要查找从现在到v
所处的UTC日开始之间经过的时间,请使用以下选项:
moment.utc(v).startOf('day').fromNow()
或者使用稍微不同但效果相同的语法:
moment(v).utc().startOf('day').fromNow()
如果您正在寻找其他内容,请澄清
演练
让我们来了解一下在我的计算机上运行您的原始代码时会发生什么。我在美国亚利桑那州,UTC-7没有夏令时
// we'll start with the string you provided
var v = '2013-07-09T13:27:29.000Z';
// and the redundant moment, but we'll take a look at the formatting
var g = moment(v).format();
console.log(g); // 2013-07-09T06:27:29-07:00
console.log(moment(g).format()) // 2013-07-09T06:27:29-07:00 (it didn't change)
// start of the local day is midnight in the local time zone
console.log(moment(g).startOf('day').format()) // 2013-07-09T00:00:00-07:00
// here's my time right now
console.log(moment().format()) // 2013-07-09T13:56:54-07:00
// and your final bit of code
console.log(moment(g).startOf('day').fromNow()); // 14 hours ago
正如您所看到的,在确定一天的开始时间时使用本地时区,它的运行是正确的。当然,当您在不同的时区运行此程序时,它将返回不同的结果。这是因为每个时区都有自己的每日概念。如果您想要一致的输出,那么您将删除startOf('day')
调用
推荐
在您上次更新声明您预期8小时后,似乎您根本不想要从startOf('day')
开始的时间。只要这样做:
moment(v).fromNow()
也不需要使用
.zone()
。您是否尝试使用矩(g,format)函数,在该函数中可以指定输入的格式?也许你的浏览器或你使用momentjs的任何地方都无法正确处理结果字符串2013-07-08T17:25:08-03:00
,尽管我觉得这没问题……是的,也试过了。使用矩(g).isValid()测试g变量返回true。这真的很烦人。@luksch-FYI,矩格式ISO字符串独立于浏览器。所以这不是兼容性或格式问题。@MattJohnson是的!我想要和当地时间相对的时间。fromNow()不是那样工作的吗?是的,它已经是那样工作的了。如果您看到其他结果,请准确显示您得到的结果以及您所在的时区。谢谢。谢谢,我会检查你的演练!同时,我编辑了我的问题,提供了示例输出命令和返回的数据!谢谢你,马特,startOf(“day”)的确是个坏人。出于某种原因,我认为我需要使用fromNow()。那太烦人了,谢谢!