7

Joda TimeLocalDateは、それ自体を次のように説明しています。

LocalDateは、タイムゾーンのない日付を表す不変の日時クラスです。

しかし、LocalDate(Object instant, DateTimeZone zone)タイムゾーンを受け入れるコンストラクターがあります。オブジェクトにタイムゾーンがない場合、タイムゾーンコンストラクターの目的は何ですか?

コンストラクタJavaDocsは次のように述べています。

日時を表すオブジェクトからインスタンスを構築し、タイムゾーンを指定されたものに強制します。

オブジェクトはタイムゾーンがないため、「タイムゾーンを指定された時間帯に強制する」とはどういう意味かわかりません。おそらく、内部でUTCに変換してから、時刻を削除します(日付を保持します)。

4

4 に答える 4

12

インスタントは、物理学の領域からの概念です。それは、あなたがそれをどのように表現するかに関係なく、明確に定義された時点です。タイムゾーン、カレンダー、または人間の文化の慣習とは、概念的には何の関係もありません。

例:アポロ11号が月に着陸した瞬間、またはJ.ケネディが撃たれた瞬間は瞬間です。これらのそれぞれは、いくつかの方法で表すことができます:ユリウス暦、タイタニック号が氷山にぶつかった瞬間から経過した秒数、火星に住む地球外の存在によって使用されるカレンダー...これらはすべて異なる表現になりますが、単一のものになります(、、または同じ番号の異なる表現のよう19030x76FMCMIII

ここで、「アポロ11号の月着陸の瞬間」をLocalDate(地球のグレゴリオ暦で使用される日-月-年)に変換する場合は、まったく異なる領域に移動します。 -一部の国ではその瞬間(1969年7月20日、20:17:40 UTC)が1969年7月20日に対応し、他の国では7月21日に対応するため、タイムゾーンを知る必要があります。

于 2012-11-19T17:10:55.680 に答える
7

タイムゾーン(または少なくともUTC /グリニッジからのオフセット)を知らずに、インスタントからローカルの日付または時刻に変換することはできません。最初の引数はインスタント(Longまたはなどjava.util.Date)であるため、使用するタイムゾーンを指定するには2番目の引数が必要です。

LocalDate(Object)内部でデフォルトのタイムゾーンを使用するコンストラクターもあることに注意してください。

于 2012-11-15T10:51:59.897 に答える
1

JavaDoc全体を読む必要があります。

オブジェクトに年表が含まれていない場合は、ISOChronologyが使用されます。指定されたタイムゾーンがnullの場合、デフォルトのゾーンが使用されます。コンストラクターが完了すると、ゾーンは使用されなくなります。

認識されるオブジェクトタイプはConverterManagerで定義され、ReadablePartial、ReadableInstant、String、Calendar、およびDateが含まれます。文字列形式は、ISODateTimeFormat.localDateParser()によって記述されます。デフォルトの文字列コンバータはゾーンを無視し、フィールド値のみを解析します。

このように、日付(文字列、カレンダー、日付など)の表現と、指定されたタイムゾーンにより、現地時間が得られます。

たとえばjava.util.Date、日付を表す場合、現地時間はタイムゾーンによって異なります。タイムゾーンを指定することにより、現地時間を定義します。

于 2012-11-14T22:18:59.257 に答える
1

(JodaStephenへの返信)

LocalDate(Object)内部でデフォルトのタイムゾーンを使用するコンストラクターもあることに注意してください。

コンストラクターをjava.util.Dateインスタントとして使用する場合、その「デフォルトのタイムゾーン」はUTCになり、一部の人が予想するようなJVMのデフォルトのタイムゾーンではないことに注意してください。(またはそのネイティブの「yyyy-MM-dd」表現LocalDateからを作成することは同じことを意味し、JVMのデフォルトのタイムゾーンを使用するため...)java.util.Datejava.util.Date.toString()

java.util.Dateしたがって、タイムゾーンを考慮せずに作成された(たとえば、「yyyy-MM-dd」文字列から解析された)を適切に変換するにはLocalDate、次のようにする必要があります。

LocalDate localDate = new LocalDate(javaUtilDate,
                              DateTimeZone.forTimeZone(TimeZone.getDefault()));

これは、少なくともJodaTime2.2には当てはまります。コードをデバッグしました。

于 2013-12-12T19:17:43.380 に答える