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

时间:2012-11-14 22:11:45

标签: java timezone jodatime

Joda Time的LocalDate将自己描述为:

  

LocalDate是一个不可变的日期时间类,表示没有的日期   时区。

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

构造函数JavaDocs声明:

  

从Object构造一个表示日期时间的实例,   将时区强制为指定的时区。

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

4 个答案:

答案 0 :(得分:12)

瞬间是来自物理领域的概念。它是一个时间点,定义明确,无论您如何表示它。它与时区,日历或人类文化的任何惯例无关 - 概念化。

例子:Apollo XI landed on Moon或J.肯尼迪被枪杀的那一刻,是时刻。这些中的每一个都可以用几种方式表示:朱利安历法,从泰坦尼克号撞上冰山的那一刻起经过的秒,一些生活在火星中的外星人所使用的日历......所有这些都是不同的表现形式,但瞬间将是一个单一的(就像19030x76FMCMIII是相同数字的不同表示。)

现在,如果你想将“阿波罗十一月登陆的瞬间”转换为一个 LocalDate (一个月 - 一年,就像地球上的格里高利日历一样),你将会一个完全不同的领域 - 一方面 - 你需要知道时区,因为在某些国家(1969年7月20日,20:17:40 UTC)对应于1969年7月20日,in others to July 21 < / p>

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

您应该阅读整个JavaDoc:

  

如果对象不包含年表,则使用ISOChronology。如果   指定的时区为空,使用默认区域。一旦   构造函数完成后,该区域不再使用。

     

识别的对象类型在ConverterManager和中定义   包括ReadablePartial,ReadableInstant,String,Calendar和Date。   String格式由。描述   ISODateTimeFormat.localDateParser()。默认的String转换器   忽略区域并仅解析字段值。

这样,日期(字符串,日历,日期等)的表示与指定的时区一起为您提供当地时间。

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

答案 3 :(得分:1)

(回复JodaStephen)

  

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

请注意,如果您使用java.util.Date作为瞬间的构造函数,那么“默认时区”将是UTC,而不是JVM默认时区期待。 (我假设从LocalDate或其原生的“yyyy-MM-dd”表示创建java.util.Date意味着相同的事情,因为java.util.Date.toString()使用JVM默认时区。 。)

因此,要正确转换在不考虑时区的情况下创建的java.util.Date(例如,简单地从“yyyy-MM-dd”字符串解析)到LocalDate,您必须执行此操作像这样的东西:

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

至少JodaTime 2.2也是如此;我们调试了代码。