1

私は moment.js + timezone を使用して日付と時刻のオブジェクトを操作し、グローバライズを使用して数値、通貨などをユーザーに表示します。

今、グローバル化で moment.js Date を出力したいので、最初のアプローチは、残念ながらタイムゾーン情報を破棄する moment.js の to 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'});
4

2 に答える 2

0

Globalize は、次期バージョン 1.3 で IANA タイムゾーンをサポートする予定です!

npm install globalize@1.3.0-alpha.0 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 を使用し、タイムゾーン部分なしで日付をフォーマットするために Globalize を使用できますか。つまり、{datetime: "medium"}[1] の 2 番目の例です。それはあなたにとって実現可能ですか?または、それに加えて moment.js を使用してタイムゾーン名を出力できますか?

1: 別の/カスタム パターンが必要な場合は、 を使用できることに注意してください{skeleton: <pattern>}

適切な答え

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

Globalize を使用して日付をフォーマットすると、CLDR 準拠のフォーマット (および最新のロケール データ) が得られ、実行時のサポートが得られます: 小さな最終ファイル サイズ (ページの読み込みを高速化するため) とプリコンパイル済みフォーマッター (クライアントでの実行を高速化するため) ) (詳細)。他にご不明な点がございましたら、お気軽にお問い合わせください。

于 2016-04-05T14:33:02.907 に答える
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 は正しい日付と正しいタイムゾーン オフセットを出力します。

于 2016-04-08T08:25:01.093 に答える