了解Java util日期
为什么java。util。日期对象显示日期&;相对于时区的时间,实际上是java。util。日期代表时间线上的一个瞬间,而不是“日期”? 自1970-01-01T00:00Z(1970 GMT/UTC开始时的午夜)以来,存储在对象中的实际数据是一个很长的毫秒计数
在docs中,还有一个java。util。Date实例没有时区的概念
如果是这样的话,为什么这个片段会打印指定时区的日期
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
}
输出:2017年3月22日星期三14:58:56
为什么它在输出中显示特定的时区?我理解SOP在内部实现了toString()。toString()会影响时区吗
# 1 楼答案
只需按照javadoc进行操作,正如它所说:
当你深入研究源代码时,这个toString()实现会在某个时候使用TimeZone.getDefault() (或者准确地说:getDefaultRef()。换句话说:默认实现会引入JVM的“默认”时区
# 2 楼答案
tl;博士
UTC当前时刻
印度时区的当前时刻
避免遗留日期时间类
因为
java.util.Date
和相关类(Calendar
,SimpleDateFormat
,等等)的设计很差。虽然他们在解决日期时间处理这一棘手问题上做出了勇敢的努力,但他们没有达到目标。它们充斥着糟糕的设计选择。您应该避免使用它们,因为它们现在已被java所取代。时间课程,一个巨大的进步特别是为了回答您的问题:
Date
的toString
方法在生成字符串时动态应用JVM的当前默认时区。因此,虽然Date
对象本身代表UTC中的一个时刻,但toString
会造成错误的印象,即它携带显示的时区更糟糕的是,在
Date
对象中有一个时区。该区域在内部使用,但与我们这里的讨论无关。令人困惑是的,还有另一个避免上这门课的原因不是真的。A
Date
代表一个特定的时刻,时间线上的一个点,以UTC为单位,分辨率为毫秒。正如您所提到的,它被定义为自UTC 1970年第一个时刻以来的毫秒计数爪哇。时间
java。时间类明确区分UTC、分区和未分区值的概念
^{} 类表示UTC中时间轴上的一个时刻,分辨率为nanoseconds(最多九(9)位小数)。这个类将替换
java.util.Date
将时区(
ZoneId
对象)应用于Instant
对象,得到ZonedDateTime
对象。该类取代了java.util.Calendar
类如果一个值只有UTC的偏移量,但没有完整的时区,请使用
OffsetDateTime
类仅对于日期,没有时间和时区,请使用
LocalDate
类。这个类取代了java.sql.Date
类。同上LocalTime
替换java.sql.Time
如果区域或偏移未知或不确定,例如“2018年12月25日午夜钟声开始圣诞节”,请使用
LocalDateTime
类。这门课不代表一个实际的时刻,时间线上的一个特定点。这门课没有任何时区或偏移的概念。所以它只能代表26-27小时范围内的潜在时刻或者
关于java。时间
java.time框架内置于Java8及更高版本中。这些类取代了legacy日期时间类,如^{} 、^{} 、&^{}
目前位于maintenance mode的Joda-Time项目建议迁移到java.time类
要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310
如果JDBC driver符合JDBC 4.2或更高版本,您可以交换java。时间对象直接与数据库连接。不需要字符串或java。sql.*上课
在哪里可以获得java。时间课
ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如^{} 、^{} 、^{} 和more