Joda Time的LocalDate
将自己描述为:
LocalDate是一个不可变的日期时间类,表示没有的日期 时区。
然而,有一个LocalDate(Object instant, DateTimeZone zone)
构造函数接受时区。如果对象是无时区的,那么时区构造函数的用途是什么?
构造函数JavaDocs声明:
从Object构造一个表示日期时间的实例, 将时区强制为指定的时区。
我不知道“强制指定时区”是什么意思,因为该对象是无时区的。也许它在内部转换为UTC,然后减少时间(保留日期)。
答案 0 :(得分:12)
瞬间是来自物理领域的概念。它是一个时间点,定义明确,无论您如何表示它。它与时区,日历或人类文化的任何惯例无关 - 概念化。
例子:Apollo XI landed on Moon或J.肯尼迪被枪杀的那一刻,是时刻。这些中的每一个都可以用几种方式表示:朱利安历法,从泰坦尼克号撞上冰山的那一刻起经过的秒,一些生活在火星中的外星人所使用的日历......所有这些都是不同的表现形式,但瞬间将是一个单一的(就像1903
,0x76F
或MCMIII
是相同数字的不同表示。)
现在,如果你想将“阿波罗十一月登陆的瞬间”转换为一个 LocalDate (一个月 - 一年,就像地球上的格里高利日历一样),你将会一个完全不同的领域 - 一方面 - 你需要知道时区,因为在某些国家(1969年7月20日,20:17:40 UTC)对应于1969年7月20日,in others to July 21 < / p>
答案 1 :(得分:7)
如果不知道时区(或至少是UTC /格林威治的偏移量),您无法从即时转换为本地日期或时间。由于第一个参数是瞬间(例如Long
或java.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也是如此;我们调试了代码。