2

この質問は、すべての言語のすべてのプログラマーにとって非常に一般的なものだと思います。これはややぼやけています。まず、文化情報やその他のものをカプセル化するロケールがあります。これらのロケール オブジェクトは、日付と時刻のフォーマット、つまり日付の表示方法に関する情報も Unicode 標準でカプセル化していると思います。例: "yyyy-MM-dd'T'HH:mm:ssZ". すべての国には独自の日付と時刻のフォーマット ルールがあるため、私たちはロケールに満足しており、アプリのユーザーはその地域で通常のフォーマットに合わせてフォーマットされた日付と時刻を取得します。

しかし今、本当に醜い部分です。カレンダーがあります。別のカレンダー。アメリカやヨーロッパ、その他の国ではグレゴリオ暦が使われていますが、ヘブライ暦、ユダヤ暦、イスラム暦などもあります。さて、これらのカレンダーはもちろん異なります。1 年の期間をさまざまな長さの単位に分割します。13 か月の場合もあれば、月曜、火曜、水曜などの代わりに月の満ち欠けだけの場合もあります。よくわかりませんが、グレゴリオ暦に慣れている人には非常に奇妙に見えるものがあることは知っています.

しかし、今はぼやけています: 日付と時刻の書式設定に実際に影響を与えるのは誰ですか? ロケール?暦体系?両方?また、ロケールは、通常、どの暦体系を使用するかを示していますか? 暦法はロケールと逆にどのように影響しますか?

私はこのトピックについてほぼ一日中検索してきましたが、それは巨大なレンガのように難しいようです.

4

3 に答える 3

2

典型的な OS では、国際慣習によりグレゴリオ暦を使用する日付ルーチンがあります。

ロケールは、日付情報のフォーマット方法と言語を決定します。

これは、OS の日付機能とは無関係に他の暦体系の使用を止めるものではありませんが、国際商取引では、共通の暦に同意する必要があるのではないでしょうか?

于 2009-08-29T13:54:57.140 に答える
1

ユーザーは、特定の暦体系を使用するのが好きな地域の出身である可能性がありますが、遠隔地の現場などにいるためにロケールが異なります。

防弾カレンダーの書式設定が必要な場合に対処する必要がある、このようなケースは他にも何百もあります。

于 2009-08-29T13:49:22.637 に答える
0

.Net framewrk でどのように機能するかを説明しようと思います

DateTime 変数に格納される値は、特定の日からのティック数です。これは、使用されるカレンダーとは無関係です。つまり、今日はカレンダーに関係なく同じ値になります。

カルチャには、日付を出力するときに使用する書式文字列とカレンダーの両方に関する情報が含まれています。

システムに文字列のフォーマットを要求すると、最初に次のような処理が行われます。

int year = culture.Calendar.GetYear(dt);
int month = culture.Calendar.GetMonth(dt);
int day = culture.Calendar.GetDay(dt);

年はグレゴリオ暦では 2009 年ですが、他の暦では別の年になります。

その後、フォーマット文字列を使用して値を正しい順序で出力します。

そのため、次のコードはヘブライ語ロケールで正しい ISO 日付を出力しません。

dt.ToString("yyyy-MM-dd'T'HH:mm:ssZ");

正しい方法は次のいずれかです

dt.ToString("yyyy-MM-dd'T'HH:mm:ssZ", CultureInfo.InvariantCulture);

また

dt.ToString("s");

後者が機能するのは、フレームワークが "s" 書式指定子 (およびその他のいくつか) のカルチャを自動的に無視するためです。

于 2009-08-29T19:51:11.473 に答える