问题 获取moment.js以显示适合查看信息的日期时间


以前的答案指向我 moment.js 对于javascript日期处理,我很高兴找到它。我可以很开心地解析和操纵。

我网站上的用户查看与不同物理站点/位置相关的信息,我想显示相关的日期时间 在特定于该位置的时间 用户位置。

每个物理站点都有一个时区属性字符串,如“Europe / London”或“Europe / Amsterdam”

我的日期时间都是以UTC格式存储和传送的。

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


11853
2018-05-03 20:06


起源

不,但你可以使用 github.com/mde/timezone-js 转换。另见这个问题(github.com/timrwood/moment/issues/162)on the moment.js github tracker;某些tz格式行为已被弃用到不同的Date.toString()实现中;它也指向timezone-js。 - Jason Clark
我担心情况可能如此,并且有些否认。 moment.js是如此优雅和小巧,用其他libs污染它似乎是一种讽刺。 :-( - 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);

但是,这需要您知道正确的偏移量,因此不会考虑夏令时。


10
2018-05-04 16:23



很多人都在谈论这个问题,所有关于OMG的问题都需要计算偏移量,但在很多情况下,你要从已经嵌入了正确偏移的服务器发送日期字符串(考虑到日光)节省时间。) - Obie


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

我链接到上面的jsTimezoneDetect将帮助您提供相关时区的候选名单。

由于mde / timezone-js,你将你的日期时间存储在UTC中会让你很容易。


2
2018-05-04 12:44





在node.js中,使用node-time实际上非常简单(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
$

0
2018-03-21 01:30





问这个问题大约一年后, 时刻时区 被介绍了。以下是Moment Timezone如何解决此问题的示例。

const databaseDate = '2014-05-01T12:00:00Z';
const databaseTimezone = 'America/New_York';
const formatString = 'MMMM Do YYYY, h:mm:ss a';

const dateInUTC = moment.utc(databaseDate);
document.getElementById('dateInUTC').textContent = dateInUTC.format(formatString) + ' in UTC';


const dateInDbTZ = moment.utc(databaseDate).tz(databaseTimezone);
document.getElementById('dateInDbTZ').textContent = dateInDbTZ.format(formatString)  + ' in ' + databaseTimezone;

const dbDateWithoutTZ = '2014-05-01T12:00:00'; // no 'Z'
const dateInLocalTime = moment(dbDateWithoutTZ);
   document.getElementById('dateInLocalTime').textContent = dateInLocalTime.format(formatString) + ' in local time or ' + dateInLocalTime.utc().format(formatString) + ' in UTC';
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.17/moment-timezone-with-data.min.js"></script>
<dl>
<dt>UTC Date</dt>
<dd id="dateInUTC"></dd>
<dt>Timezone-formatted Date</dt>
<dd id="dateInDbTZ"></dd>
<dt>Bad: non-UTC date interpreted as "local time"</dt>
<dd id="dateInLocalTime"></dd>
</dl>


0
2018-05-23 10:21