Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.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_Momentjs - Fatal编程技术网

Javascript 时区解析地狱

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

我有这个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来计算时间

为什么?

编辑:我已经测试了另一个时间插件(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()。那太烦人了,谢谢!