2016-04-04 7 views
1

私はmoment.js + timezoneを使って日時オブジェクトを操作し、globalizeを使用して数値、通貨などを表示します。jqueryでモーションをフォーマットするjapan.maximgi- tion.com

私はmomentize.jsの日付を印刷したいのですが、最初のアプローチは、残念ながらタイムゾーン情報を破棄するmoment.jsのgetDate()関数を使用することでした(例1)。 Date-Valuesを正しいタイムゾーンに変換して新しいDate()を初期化すると、正しい結果(例2)が得られますが、フルバージョンを使用すると、UTCが正しく表示されません。これらのコンポーネントを連携させる方法はありますか?

var m = moment.tz(1459779436, 'Europe/Berlin'); 
// Ex 1: Date is printed in UTC, so with an offset of 2 hours 
globalize.formatDate(m.getDate(), {datetime: 'full'}); 
globalize.formatDate(new Date(m.toISOString()), {datetime: 'full'}); 
// Ex 2: Correct times are printed, but with wrong timezone 
globalize.formatDate(new Date(m.year(), m.month(), m.date(), m.hour(), m.minute(), m.seconds(), m.milliseconds()), {datetime: 'full'}); 

答えて

0

グローバル化は、今後のバージョン1.3でIANAタイムゾーンをサポートする予定です!

npm install [email protected] cldr-data iana-tz-data 

その後

var Globalize = require("globalize"); 
Globalize.load(require("cldr-data").entireSupplemental()); 
Globalize.load(require("cldr-data").entireMainFor("en")); 
Globalize.loadIANATimezone(require("iana-tz-data")); 

Globalize("en").formatDate(new Date(), {datetime: "short", timeZone: "America/Los_Angeles"}); 
// > '3/19/17, 3:19 PM' 
Globalize("en").formatDate(new Date(), {datetime: "short", timeZone: "America/New_York"}); 
// > '3/19/17, 6:19 PM' 
Globalize("en").formatDate(new Date(), {datetime: "short", timeZone: "America/Sao_Paulo"}); 
// > '3/19/17, 7:19 PM' 
Globalize("en").formatDate(new Date(), {datetime: "short", timeZone: "Europe/Berlin"}); 
// > '3/19/17, 11:19 PM' 

Globalize("en").formatDate(new Date(), {datetime: "full", timeZone: "America/Los_Angeles"}); 
// > 'Sunday, March 19, 2017 at 3:19:22 PM Pacific Daylight Time' 
Globalize("en").formatDate(new Date(), {datetime: "full", timeZone: "America/New_York"}); 
// > 'Sunday, March 19, 2017 at 6:19:22 PM Eastern Daylight Time' 
Globalize("en").formatDate(new Date(), {datetime: "full", timeZone: "America/Sao_Paulo"}); 
// > 'Sunday, March 19, 2017 at 7:19:22 PM Brasilia Standard Time' 
Globalize("en").formatDate(new Date(), {datetime: "full", timeZone: "Europe/Berlin"}); 
// > 'Sunday, March 19, 2017 at 11:19:53 PM Central European Standard Time' 

PS:それはまた、特定のIANAのタイムゾーンでの解析日付文字列をサポートしています。ここ

詳細https://github.com/globalizejs/globalize/pull/701#issuecomment-287652673


旧答え:

あなたは日付操作のためのmoment.jsを使用して、タイムゾーンの部分なしで日付をフォーマットするためのグローバル化を使用することができ、すなわち、{datetime: "medium"}とあなたの第二の例[ 1]。それは実現可能ですか?あるいは、タイムゾーン名を印刷するためにmoment.jsを持つプラスを使用できますか?

1:異なる/カスタムパターンが必要な場合は、{skeleton: <pattern>}を使用できます。

適切な答え

タイムゾーンのサポートをグローバル化は、その時間帯のサポートすなわち、ユーザのローカルタイムゾーンのオフセットとそれがすべてだ取得に制限されているネイティブのJavaScript日、によって提供される何に限定され、それが設定を許可しません異なるタイムゾーン名またはタイムゾーンオフセットを持つ日付。したがって、ユーザーのローカルタイムゾーン(任意のものではない)の書式設定のみが可能です。したがって、Globalizeは日付と時刻を書式設定するのに役立ちますが、タイムゾーンの部分は使用できません。タイムゾーンのグローバル化の詳細については、https://github.com/jquery/globalize/pull/202#issuecomment-33020199を参照してください。

グローバル化を使用して日付をフォーマットすると、CLDR準拠のフォーマット(および最新のロケール・データ)が提供され、ランタイム・サポートが提供されます(ページ・ロードの高速化)。クライアントでの高速実行)(more info)。私はこれが何らかの助けになることを願っています。あなたにさらなる質問があるかどうか私に知らせてください。

+0

説明のためにありがとう、ほとんど私が考え出したものと一致します。私はノードアプリケーションで両方のコンポーネントを使用して、顧客が選択可能なテンプレートで日付をフォーマットできるようにしています。そのため、日付/時刻/ datetime + short/meidum/long/fullテンプレート私は推測する別のソリューションを使用する必要があります。それにもかかわらず、ありがとう! –

0

私は本当にハッキーなアプローチを採用し、新しいDateのgetTimezoneOffsetを、瞬時のタイムゾーンによって生成された値を返す関数に置き換えました。

function momentToDate(input) { // Do NOT use the result to anything else than passing it into globalize 
    var res = new Date(input.year(), input.month(), input.date(), input.hour(), input.minute(), input.seconds(), input.milliseconds()); 
    var offset = input.utcOffset(); 
    res.getTimezoneOffset = function() { 
     return offset; 
    } 
    return res; 
} 

したがって、globalizeは正しい日付と正しいタイムゾーンオフセットを出力します。

関連する問題