获取moment.js以显示适合于正在查看的信息的日期时间

问题描述:

以前的回答在这里指出我为moment.js处理javascript日期,我很高兴找到它。我可以很快乐地解析和操纵。获取moment.js以显示适合于正在查看的信息的日期时间

在我的网站看看与不同物理地点/位置信息的用户,我想表明相关日期时间具体到该位置时间用户的位置。

每个物理站点有一个时区属性字符串,如“欧洲/伦敦”或“欧洲/阿姆斯特丹”

我的日期时间都存储在UTC从数据库交付。

是否有一个聪明的简单方法,我可以在任何指定的时区渲染我的moment.js对象?

+2

不,但您可以使用https://github.com/mde/timezone-js进行转换。另请参阅关于moment.js github跟踪器的此问题(https://github.com/timrwood/moment/issues/162);一些tz格式的行为已被弃用到不同的Date.toString()实现;它也指向timezone-js。 –

+1

我担心这可能是这种情况,并有些否认。 moment.js是如此的优雅和小巧,似乎是一种嘲弄它与其他库的混淆。 :-( – Aitch

理论上,你可以做这样的事情。

moment.fn.formatInZone = function(format, offset) { 
    return this.clone().utc().add('hours', offset).format(format); 
} 

moment().formatInZone('HH:mm:ss', 7); 
moment().formatInZone('HH:mm:ss', -7); 

但是,这要求您知道正确的偏移量,所以它不会考虑夏令时。

+0

很多人在谈论这个问题时都会得到所有关于OMG的信息,你需要计算偏移量,但是在很多情况下,你从服务器发送的日期字符串中已经有了正确的偏移量(考虑到夏令时。) – Obie

如果你想在另一个时区比用户显示日期实际上是,那么你需要开始寻找到的东西像https://bitbucket.org/pellepim/jstimezonedetect(如果需要检测哪个时区用户在)如果您需要本地化和https://github.com/mde/timezone-js区域之间的日期。

我链接到上面的jsTimezoneDetect将帮助您提供相关时区的简短列表。

由于mde/timezone-js,你有你的日期时间存储在UTC将使它非常容易为你。

在node.js中,这实际上非常简单,使用节点时间(https://github.com/TooTallNate/node-time)。覆盖全局Date对象,然后再扩展moment.js:

var time = require('time')(Date), 
    moment = require('moment'); 

moment.fn.setTimezone = function(timezone, relative) { 
    this.toDate().setTimezone(timezone, relative); 
    return this; 
} 

moment.fn.getTimezone = function() { 
    return this.toDate().getTimezone(); 
} 

良好的措施,让我们在一个效用函数抛出去“进入”日期/时间字符串转换为UTC:

moment.fromTimezone = function(datetime, timezone) { 
    return moment(datetime, "YYYY-MM-DD HH:mm").setTimezone(timezone, true).setTimezone("UTC"); 
} 

,你可以做到这一点:

var fmt = "YYYY-MM-DD HH:mm", 
    datetime = "2013-03-21 00:40", 
    timezone = "Israel", 
    m = moment.fromTimezone(datetime, timezone); 

console.log(datetime, "in", timezone, "is", m.format(fmt), "in UTC"); 
console.log(m.format(fmt), "in UTC is", m.setTimezone(timezone).format(fmt), "in", m.getTimezone()); 

壳牌输出:

$ node mtz.js 
2013-03-21 00:40 in Israel is 2013-03-20 22:40 in UTC 
2013-03-20 22:40 in UTC is 2013-03-21 00:40 in Israel 
$