11

ここでの以前の回答は、javascript の日付処理のためにmoment.jsを指摘してくれました。私は非常に満足して解析および操作できます。

私のウェブサイトのユーザーは、さまざまな物理的なサイト/場所に関する情報を見ており、ユーザーの場所ではなく、その場所に固有の時間に関連付けられた日時を表示したいと考えています。

各物理サイトには、「ヨーロッパ/ロンドン」や「ヨーロッパ/アムステルダム」などのタイムゾーン属性文字列があります

私の日時はすべてUTCでDBから保存および配信されます。

指定されたタイムゾーンで moment.js オブジェクトをレンダリングできる巧妙で簡単な方法はありますか?

4

4 に答える 4

10

理論的には、このようなことができます。

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);

ただし、これには正しいオフセットを知っている必要があるため、夏時間は考慮されません。

于 2012-05-04T16:23:55.317 に答える
2

ユーザーが実際にいるタイムゾーンとは別のタイムゾーンで日付を表示したい場合は、https://bitbucket.org/pellepim/jstimezonedetect (ユーザーがいるタイムゾーンを検出する必要がある場合)などを調べる必要があります。ゾーン間で日付をローカライズする必要がある場合は、https://github.com/mde/timezone-jsを参照してください。

上記でリンクした jsTimezoneDetect は、関連するタイムゾーンの候補リストを提供するのに役立ちます。

日時を UTC で保存すると、mde/timezone-js のおかげで非常に簡単になります。

于 2012-05-04T12:44:37.800 に答える
0

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
$
于 2013-03-21T01:30:45.873 に答える