关于java:Joda Time LocalDate(Object instant,DateTimeZone zone)构造函数的用途

Purpose of Joda Time LocalDate(Object instant, DateTimeZone zone) constructor

Joda Time的LocalDate将自己描述为:

LocalDate is an immutable datetime class representing a date without a
time zone.

然而,有一个LocalDate(Object instant, DateTimeZone zone)构造函数接受时区。如果对象是无时区的,那么时区构造函数的目的是什么?

构造函数javadocs声明:

Constructs an instance from an Object that represents a datetime,
forcing the time zone to that specified.

我不知道"强制时区到指定的时间"是什么意思,因为对象是不带时区的。也许它在内部转换为UTC,然后减少时间(保留日期)。


瞬间是物理学领域的一个概念。它是一个时间点,定义良好,不管你如何表示它。它与时区、日历或人类文化的任何习俗在概念上无关。

例子:阿波罗登陆月球的那一刻,或者J. Kennedy被击毙的那一刻,都是瞬间。每一个都可以用几种方式来表示:朱利安历法,从泰坦尼克号撞上冰山的那一刻开始,几秒钟就过去了,一些生活在火星上的外星人使用的历法……所有这些都是不同的表示,但瞬间将是单一的表示(就像19030x76FMCMIII是相同数字的不同表示)。

现在,如果你想把"阿波罗登月时刻"转换成一个当地日期(一天一个月,就像在地球的格雷高利历法中使用),你将进入一个完全不同的领域,一方面,你需要知道时区,因为在一些国家,即刻(1969年7月20日,20:17:40UTC)对应于1969年7月20日,在其他的To 7月21日


如果不知道时区(或至少是从UTC/格林威治的偏移量),则无法从即时转换为本地日期或时间。由于第一个参数是一个瞬间(如Longjava.util.Date,因此需要第二个参数来指定要使用的时区。

注意,还有一个构造函数LocalDate(Object)在内部使用默认时区。


(回复乔达斯特芬)

Note that there is also a constructor LocalDate(Object) which uses the default time-zone internally.

请注意,如果使用java.util.Date作为即时的构造函数,"默认时区"将是UTC,而不是一些人所期望的JVM默认时区。(我假设从java.util.Date或其本地的"yyyy-mm-dd"表示创建LocalDate意味着相同的事情,因为java.util.Date.toString()使用了jvm默认时区…)

因此,要正确地将创建的java.util.Date转换为LocalDate,而不考虑时区(例如,简单地从"yy-mm-dd"字符串解析为LocalDate),必须执行以下操作:

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

至少对于jodatime 2.2是这样的;我们已经调试了代码。


您应该阅读整个javadoc:

If the object contains no chronology, ISOChronology is used. If the
specified time zone is null, the default zone is used. Once the
constructor is completed, the zone is no longer used.

The recognised object types are defined in ConverterManager and
include ReadablePartial, ReadableInstant, String, Calendar and Date.
The String formats are described by
ISODateTimeFormat.localDateParser(). The default String converter
ignores the zone and only parses the field values.

这样,日期(字符串、日历、日期等)的表示形式以及指定的时区将为您提供本地时间。

例如,如果您有日期的java.util.Date表示,那么它的本地时间取决于时区。通过指定时区,可以定义本地时间。