7

Joda TimeLocalDate将自己描述为:

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

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

构造函数 JavaDocs 指出:

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

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

4

4 回答 4

12

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

例如:阿波罗 XI 号登陆月球的那一刻,或者 J. Kennedy 被枪杀的那一刻,都是瞬间。每一个都可以用几种方式表示:儒略历,从泰坦尼克号撞上冰山那一刻起的几秒钟,一些生活在火星上的外星人使用的日历......所有这些都是不同的表示,但瞬间将是一个(就像19030x76F或者MCMIII是相同数字的不同表示)。

现在,如果您想将“阿波罗 XI 登月瞬间”转换为LocalDate(地球公历中使用的日-月-年),您将进入一个完全不同的领域,并且 - 一方面- 您需要知道时区,因为在某些国家/地区,即时(1969 年 7 月 20 日,20:17:40 UTC)对应于 1969 年 7 月 20 日,在其他国家/地区对应于 7 月 21 日

于 2012-11-19T17:10:55.680 回答
7

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

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

于 2012-11-15T10:51:59.897 回答
1

您应该阅读整个 JavaDoc:

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

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

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

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

于 2012-11-14T22:18:59.257 回答
1

(回复乔达斯蒂芬)

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

请注意,如果您使用带有 ajava.util.Date作为即时的构造函数,则“默认时区”将是 UTC,而不是某些人所期望的 JVM 默认时区。(我假设LocalDate从 ajava.util.Date或其本机“yyyy-MM-dd”表示创建 a 意味着相同的事情,并且因为java.util.Date.toString()使用 JVM 默认时区......)

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

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

至少 JodaTime 2.2 是这样。我们已经调试到代码中。

于 2013-12-12T19:17:43.380 回答