11

私は、日付と時刻を多く扱わなければならないプロジェクトに取り組んでいます。サーバー側のテクノロジーは ASP.Net で、クライアント側では jQuery と jQuery Week Calendar (jQuery プラグイン) を使用しています。

ここに説明されている問題があります。サーバーからこのような2012-11-13T04:45:00.00GMT形式のデータ時刻を受信して​​います。

クライアント側では、この日付時刻を、IST、EST、PKT などのように、ロケールの日付時刻形式に変換したいと考えています。

これを実現するために、JavaScript メソッドを使用していますtoLocaleString()。これはChromeでのみ正常に機能し、他のブラウザでは一貫して機能しません。

さまざまなブラウザーでの出力は次のとおりです。

Google Chrome (正常に動作):

電話:

new Date ("2012-11-13T04:45:00.00").toLocaleString();

出力:

Tue Nov 13 2012 10:15:00 GMT+0530 (India Standard Time)

モジラ ファイアフォックス:

電話:

new Date ("2012-11-13T04:45:00.00").toLocaleString();

出力:

Tuesday, November 13, 2012 4:45:00 AM

サファリ:

電話:

new Date ("2012-11-13T04:45:00.00").toLocaleString();

出力:

Invalid Date

インターネットエクスプローラ:

電話:

new Date ("2012-11-13T04:45:00.00").toLocaleString();

出力:

Tuesday, November 13, 2012 4:45:00 AM

今のところ、これらは私がテストしたブラウザーです。

質問は次のとおりです。

2012-11-13T04:45:00.00どのブラウザ クライアントを使用していても、Data Time (このような形式) を Locale Date and Time に変換する方法が必要です。

4

4 に答える 4

11

簡単な答えはノーです。toLocaleStringは、開発者が望む方法で実装できます。あなたの質問が意味することは、Chromeがあなたが望む文字列を出力するということです

そのフォーマットを一貫して出力したい場合は、DateJSのような別のライブラリを使用する必要があります。

DateJSでこれを行うには、core.jsで使用できるいくつかの標準形式指定子と、extras.jsでのみ使用できるいくつかの標準形式指定子が必要になります。ドキュメントには、すべてのフォーマット指定子のリストがあります。

必要な文字列は次のとおりです。

Tue Nov 13 2012 10:15:00 GMT+0530 (India Standard Time)

したがって、DateJSからこれを取得するには、次のものが必要です。

"D M d Y H:i:s \G\M\TO (e)"

DateJSの構文は次のとおりです。

new Date ("2012-11-13T04:45:00.00").format("D M d Y H:i:s \G\M\TO (e)");
于 2012-11-21T21:30:00.013 に答える
5

時代遅れで、すべての Web ブラウザーtoLocaleString()で正しく実装されていないを使用する代わりに、日付と時刻の書式設定にGlobalizeを使用することを強くお勧めします。

次に、クライアント側で日付をフォーマットするには、有効なカルチャを割り当てて、フォーマット関数を呼び出すだけです。

Globalize.culture(theCulture);
Globalize.format( new Date(2012, 1, 20), 'd' ); // short date format
Globalize.format( new Date(2012, 1, 20), 'D' ); // long date format

とてもシンプルですね。それを ASP.Net アプリケーションにも統合する必要があるため、少し複雑になります。まず、通常の方法で globalize.js を参照する必要があります。

<script type="text/javascript" src="path_to/globalize.js"></script>

次に、適切なカルチャ定義を含めることをお勧めします。これは、書式設定時に使用する必要があるものです。

<script type="text/javscript" src="path_to/cultures/globalize.culture.<% = CultureInfo.CurrentCulture.ToString() %>.js"></script>

theCulture最後に、使用する前に変数を設定する必要があります。

<script type="text/javscript">
    var theCulture = <% = CultureInfo.CurrentCulture.ToString() %>
</script>

もちろん、よりエレガントな方法は、コード ビハインドでプロパティまたはメソッドを作成し、適切なスクリプトを書き留めてから、メソッドだけを参照することです。たとえば、次のようにします。

public string IntegrateGlobalize(string pathToLibrary)
{
  var sb = new StringBuilder();
  sb.Append("<script type=\"text/javascript\" src=\"");
  sb.Append(pathToLibrary);
  sb.AppendLine("/globalize.js\"></script>");
  sb.Append("<script type=\"text/javascript\" src=\"");
  sb.Append(pathToLibrary);
  sb.AppendLine("/cultures/globalize.culture.");
  sb.Append(CultureInfo.CurrentCulture);
  sb.AppendLine(\"></script>");
  sb.Append("<script type=\"text/javascript\">");
  sb.Append("var theCulture = ");
  sb.Append(CultureInfo.CurrentCulture);
  sb.AppendLine(";</script>");

  return sb.ToString();
}

次に、(マスター?) ページ ヘッドでこのメソッドを参照するだけです。

<head>
  <% = IntegrateGlobalize("path_to_globalize") %>
  ...
</head>

いくつかの問題

100% 正しく実行したい場合は、Globalize カルチャ ジェネレーターを拡張して'g'フォーマット スイッチを含め、クライアント側でこの正確なスイッチを使用して日付をフォーマットする必要があります。

Globalize.format( new Date(2012, 1, 20), 'g' ); // default date format

何故ですか?「g」はデフォルトの日付形式であるためです。DateTimeこれは、パラメーターなしでのメソッドを呼び出すだけで得られるものですToString()(これは、唯一のパラメーターとして暗示CultureInfo.CurrentCultureされます...)。デフォルトの形式が最適です。短い形式、長い形式、またはその他の形式になりますが、このカルチャを使用する人々が最も一般的に使用する形式です。

toLocaleString()それはすべての Web ブラウザーにとって間違っていると言いました。何故ですか?これは、サーバー側で検出されたカルチャではなく、Web ブラウザーの設定を使用するためです。つまり、同じ Web ページにさまざまな文化が混在している可能性があります。これは、日付の一部がサーバー側でフォーマットされ、他の日付がクライアント側でフォーマットされている場合に発生する可能性があります。そのため、サーバー側からカルチャを渡す (検出する) 必要がありました。
ところで。toLocaleString()地域設定ダイアログをWebアプリケーションに含めることにした場合、ユーザー設定に従わないため、不一致がさらに目立ちます...

于 2012-11-23T11:05:23.203 に答える
2

この問題の根本原因は、どの回答でも解決されませんでした。OPは言った:

サーバーからこのような2012-11-13T04:45:00.00GMT 形式のデータ時刻を受信して​​います。

GMT は形式ではありません。この文字列は ISO 8601 拡張形式で、タイム ゾーンは指定されていません。ISO 8601 仕様によると、修飾子がない場合、これは現地時間を表すことを意図しています。GMT を指定するZには、末尾に a を追加するか、 などのオフセットを追加します+00:00

問題は、ECMAScript (v1 - v5.1) が仕様のこの条項を尊重していないことです。実際には、現地時間ではなく UTC として解釈する必要があるとのことでした。ISO 仕様を尊重するブラウザーもあれば、ECMA 仕様を尊重するブラウザーもあります。これはバージョン 6 で修正され、ほとんどのブラウザが準拠しています。

したがって、UTC/GMT ベースのタイムスタンプを送信する場合は、サーバー側で常に送信する必要があるZため、あいまいさがなくなります。

それでも、が正しく解釈されたとしても、文字列がブラウザー間で同じようにフォーマットされるという保証はありません。そのためには、確かにライブラリが必要です。moment.jsをお勧めしますが、他にもあります。

于 2015-11-23T20:35:58.877 に答える
2

サーバーで時刻をロケール固有の文字列に変換するには、メソッドDateTime.ToLongDateStringを使用できます。そのページで、クラスDateTimeFormatInfoの「現在のカルチャ オブジェクト」(サーバー上) に関するメモを参照してください。正しく設定されていることを確認してください。

于 2012-11-19T15:41:16.130 に答える