ロケールとタイムゾーンは直交する問題です
Locale
ALocale
は次のペアを表します。
- フランス語、英語、中国語などの人間の言語。
- キャピタライゼーション、省略形、日付の日-月-年などの要素の順序などのフォーマットの質問などの問題を決定し、小数点としてCOMMAとFULLSTOPを使用するための一連の文化的規範。
Locale
地理的ではありません。文化的規範を表す方法として国または地域を使用するLocale
場合がありますが、それは文字通り、ユーザーが特定の地理的領域にいることを意味するものではありません。たとえば、日本の東京で開催された会議でケベックのエンジニアがのロケールを使用しますがLocale.CANADA_FRENCH
、彼女のタイムゾーンはAsia/Tokyo
旅行中のものである可能性があります。
ZoneId
タイムゾーン、は、特定の地域の人々が使用するUTCからZoneId
のオフセットに対する過去、現在、および将来の変更の履歴を表します。オフセットは、UTCで使用される本初子午線の前後の数時間-分-秒にすぎません。世界中の政治家は、タイムゾーンを頻繁に再定義し、管轄区域で使用されるオフセットを変更する傾向を示しています。実際、夏時間(DST)の愚かさを採用した地域では、オフセットが年に2回、約6か月ごとに変更されます。
➥つまり、特定のロケールから現在の時刻やタイムゾーンを取得することはできません。
ロケールを使用してカレンダーを作成すると、TimeZoneはローカルのカレンダーに戻ります。
JSR 310によって定義された最新のjava.timeクラスに取って代わられ、現在はレガシーであるひどい日時クラスを使用しています。
UTCで現在の瞬間(ゼロ時間-分-秒のオフセット)を取得するには、を使用しますInstant
。定義上、 AnInstant
は常にUTCです。
Instant instant = Instant.now() ; // Capture the current moment in UTC.
特定のタイムゾーンの現在の瞬間が必要な場合は、オブジェクトZoneId
を取得するようにを指定しZonedDateTime
ます。
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ; // Capture the current moment as seen in the wall-clock time used by the people of a particular region.
適用するタイムゾーンを知ることに関しては、上で述べたように、次のいずれかを行う必要があります。
を呼び出すと、既知のタイムゾーンのリストを取得できますZoneId.getAvailableZoneIds
。
Calendar c = new GregorianCalendar( locale ) ;
GregorianCalendar
をとるこのコンストラクターによって混乱するかもしれませんLocale
、そして当然のことながらそうです。
このコンストラクターは、従来の日時クラスに見られる多くの不適切で誤った設計上の決定の1つです。率直に言って、これらのレガシークラスは非常にひどいものであり、日時処理の複雑さと微妙さを理解していない人々によって設計されています。Sun、Oracle、およびJCPコミュニティは、正当な理由でそれらをjava.timeに置き換えることを決定しました。
Locale
ユーザーに表示する日時オブジェクトの値を表すテキストを生成する場合は、タイムゾーンと交差します。ALocale
は、月の名前、曜日の名前などの翻訳に使用する人間の言語を指定します。またLocale
、月または曜日の省略(名前は大文字ですか?終止符が追加されていますか?)、日、月、年の順序付けなどの問題を決定するための文化的規範を指定します。