2017-09-26 50 views
3

我试图使用moment.js将存储在数据库中的日期(设置为Europe/London时区)与当前用户时间进行比较,并考虑到它们的时区。时刻JS - 正确比较当地时间的方法

我从数据库返回的日期字符串,是想用fromNow()功能,如下所示:

console.log(dbDate); 
console.log(moment().format()); 
console.log(moment(dbDate).fromNow()); 

// DB stored time (Europe/London) 
// 2017-09-26 06:56:26 

// Current user time (timezone is Pacific Time/Los Angeles) 
// 2017-09-25T23:59:03-07:00 

// String output by fromNow() function, which should reflect the timezone difference but doesn't 
// in 7 hours 

我想fromNow()字符串来考虑时区差异,这应该是一个时间"ago"而不是在将来。

我可能错过了一些相当明显的图书馆,所以如果这很简单,请事先道歉。

回答

0
// get the current time so we know which offset to take 
var now = moment.utc(); 
// get the zone offsets for this time, in minutes 
var NewYork_tz_offset = moment.tz.zone("America/New_York").offset(now); 
var MY_DATE = moment(dbDate); 
// calculate the difference in hours 
console.log((NewYork_tz_offset - MY_DATE)/60); 

这是否有助于您的事业?

+0

谢谢。我不会知道用户的时区,所以我需要检测它,但用下面的代码不能按预期工作'var NewYork_tz_offset = moment.tz.zone(moment.tz.guess())。offset(现在);' - 任何想法? – tomphilps

+0

你的'dbDate'''格式是什么? ISO? –

+0

它是UTC我相信(使用Magento) – tomphilps

0

你必须使用moment timezone,您可以分析dbDate指定使用moment.tz"Europe/London"时区:

moment.tz构造通吃相同的参数此刻构造,但使用的最后一个参数为一个时区标识符。

然后你可以使用时刻difffromNow

这里一个活生生的例子:

var dbDate = "2017-09-26 06:56:26"; 
 
var now = moment(); 
 
var momDbDate = moment.tz(dbDate, "Europe/London"); 
 
var pacificTime = moment("2017-09-25T23:59:03-07:00"); 
 
console.log(dbDate); 
 
console.log(moment().format()); 
 
console.log(momDbDate.fromNow()); 
 
console.log(momDbDate.diff(now, 'hours')); 
 
console.log(momDbDate.diff(pacificTime, 'hours'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data-2012-2022.min.js"></script>