2012-05-03 8 views
11

ここでの前回の回答は、JavaScriptの日付処理のためにmoment.jsに私を指摘してくれて本当に嬉しいです。私は非常に幸せに解析し、操作することができます。表示されている情報に適切な日付時刻を表示するmoment.jsを取得する

多様な物理サイト/場所に関する情報で私のウェブサイトを見て上のユーザー、と私はその場所に特定の時間内の関連する日付時刻を表示したい、ないユーザーの場所。

各物理サイトには、「ヨーロッパ/ロンドン」または

私の日付時刻がすべて保存され、UTCにDBから配信されている「ヨーロッパ/アムステルダム」のようなタイムゾーンの属性文字列を持っています。

私のmoment.jsオブジェクトを任意のタイムゾーンでレンダリングすることができますか?

+2

いいえ、https://github.com/mde/timezone-jsを使って変換することができます。 moment.js github trackerのこの問題(https://github.com/timrwood/moment/issues/162)も参照してください。いくつかのtz形式の動作は、Date.toString()実装のさまざまなものに非難されています。 timezone-jsも指しています。 –

+1

私はこれが事実かもしれないと恐れ、やや否定的でした。 moment.jsは非常にエレガントで小さく、他のライブラリと一緒にそれを汚染するのは難しいようです。 :-( – Aitch

答えて

10

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

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

+0

この問題について話している多くの人がオフセットを計算する必要があるOMGに関するすべてのverklemptを取得しますが、多くの場合、正しいオフセットが既に埋め込まれているサーバーから日付文字列を送ります夏時間を考慮して)。 – Obie

2

ユーザーが実際に存在する時間帯以外の時間帯に日付を表​​示する場合は、https://bitbucket.org/pellepim/jstimezonedetect(ユーザーのタイムゾーンを検出する必要がある場合)や、ローカライズする必要がある場合はhttps://github.com/mde/timezone-jsゾーン間の日付。

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

あなたはあなたのdatetimeをUTCに保存していると、mde/timezone-jsのおかげでかなり簡単になります。

0

node.jsでは、これはノードタイム(https://github.com/TooTallNate/node-time)を使用するとかなり簡単です。あなたができる

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

そして:さんはUTCに「入ってくる」日付/時刻文字列を変換するユーティリティ関数で投げてみましょう良い測定のために

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

:その後、moment.jsを拡張し、グローバルDateオブジェクトを上書き次の操作を行います。

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 
$