java日期时间转日期
长期以来,正确处理日期,时间,时区,夏令时,and年等一直是我的烦恼。 本文并不是一个全面的指南时域,请参阅日期和时间在Java中 -更详细,但略有下降,ekhem,日期。 它仍然是相关的,但是没有涵盖Java 8中的java.time
。我想介绍每个初级Java开发人员都应该意识到的绝对最低要求。
事件何时发生?
除了哲学和量子物理学,我们还可以将时间视为一维度量标准,即实数值。 随着时间的流逝,该值将不断增长。 如果一个事件接连发生,我们将为该事件分配更多时间。 同时发生的两个事件具有相同的时间值。 出于实际原因,在计算机系统中,我们将时间存储为离散整数,这主要是因为计算机时钟离散地滴答。 因此,我们可以将时间存储为整数值。 按照惯例,我们将time = 0分配给1970年1月1日,但是在Java中,此值每毫秒递增一次,而不是像UNIX time那样每秒递增。 历史上在UNIX时间中使用32位带符号整数将导致2038年问题 。 因此,Java将时间存储在64位整数中,即使您将其增加一千次也足够了。 话虽这么说,但用Java存储时间的最简单但有效的方法是…… long
原始语言:
long timestamp = System.currentTimeMillis();
long
存在的问题是,它太普遍了,以至于使用它来存储时间会破坏类型系统。 它可以是ID,可以是哈希值,可以是任何东西。 而且long
没有与时域相关的任何有意义的方法。 包裹的第一个办法long
在更有意义的对象是java.util.Date
因为Java 1.0中称为:
Date now = new Date();
Date
类具有很多缺陷:
- 它不代表…日期。 认真地讲,正式日期是“ […]由数字[…]指定的月份或年份中的日期” [1],而在Java中,它表示没有任何特定日历(天/月/年)的时间点。
- 它的
toString()
具有误导性,在系统时区中显示日历日期和时间。 不仅误导了成千上万的开发人员以为Date
附加了时区。 此外,它显示时间,但日期应仅表示日期,而不是小时。 - 它有20多个不推荐使用的方法,包括
getYear()
,parse(String)
和许多构造函数。 之所以不建议使用这些方法,是因为它们使您相信Date
表示date 。 -
java.sql.Date
扩展了java.util.Date
,实际上更加准确,因为它确实表示日历日期 (SQL中的DATE
)。 但是,这缩小了基类Date
的功能,从而违反了Liskov替换原则 。 不相信我吗java.util.Date.toInstant()
可以正常工作,但是java.sql.Date.toInstant()
无条件地失败,并带有UnsupportedOperationException
…… - 最糟糕的是,
Date
是可变的 。
有没有想过为什么您的团队中老旧且脾气暴躁的开发人员对不变性如此兴奋? 想象一下一段代码,它将任何一分钟添加到Date
。 简单吧?