Java中的日期和时间处理在不同的版本中经历了多次改进和演变。下面我会介绍Java中的三个主要日期和时间处理API:第一代日期(java.util.Date和java.util.Calendar)、第二代日期(java.time包中的类)以及第三代日期(Java 8引入的java.time包中的更新)。
第一代日期:java.util.Date和java.util.Calendar
这是Java早期提供的日期和时间处理方式。java.util.Date
类用于表示日期和时间,但它存在一些问题,例如对不可变性的支持不足,以及与时区相关的处理不佳。java.util.Calendar
类在一定程度上解决了这些问题,但仍然不够直观和易用。
问题:
- 可变性:
java.util.Date
是可变的,通过源码(public class Date)可知,它并不是final的。这会导致潜在的线程安全问题。 - 设计不佳:日期和时间处理的设计不够优雅,例如月份从0开始,不符合直觉。
第二代日期:java.time包中的类
Java 8引入了java.time
包,其中包含了一组全新的日期和时间处理类,用于更好地处理日期和时间问题,解决了第一代日期类的问题。
主要类包括:
LocalDate
:表示日期(年、月、日),不包含时间和时区信息。LocalTime
:表示时间(时、分、秒、毫秒),不包含日期和时区信息。LocalDateTime
:结合了LocalDate
和LocalTime
,表示日期和时间,但仍不包含时区信息。ZonedDateTime
:包含完整的日期、时间和时区信息。- 等等。
优点:
- 不可变性:
java.time
包中的类都是不可变的,更适合多线程环境。 - 设计优雅:类的设计更符合直觉,例如月份从1开始。
- 易于计算:提供了更方便的日期和时间计算方法。
第三代日期:java.time包中的更新
在Java 8之后,java.time
包还进行了一些更新,以进一步改进日期和时间处理。
Java 8之后的一些更新:
- Java 8引入的
java.time
包已经是一个强大的日期和时间处理库,因此后续的Java版本没有引入大的变化。 - Java 9、10、11等版本中主要是一些小的改进和性能优化。
选择问题:
-
第一代日期:不推荐使用,因为它存在可变性和设计问题,不利于编程和维护。
-
第二代日期:推荐在Java 8及更高版本中使用
java.time
包中的类。它们提供了更好的设计和功能,适用于大多数的日期和时间处理需求。 -
第三代日期:考虑到性能和功能上的提升,Java 8引入的
java.time
包已经足够满足大多数需求,所以在后续版本中没有必要强制迁移到新的API。只有在需要特定的新功能或改进时,才需要考虑更新使用。
综上所述,大多数情况下,推荐使用第二代日期(java.time
包中的类),除非有特定的需求需要使用第三代日期(如果有的话)。避免使用第一代日期(java.util.Date
和java.util.Calendar
)由于其设计和问题。
第二代日期的代码:
public class LocalDateTime_ {
public static void main(String[] args) {
//通过now()得到现在的时间
LocalDateTime now = LocalDateTime.now();
//使用DateTimeFormatter类的ofPattern方法定义要转换的格式需求
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss E");//E表示星期几
//通过DateTimeFormatter的对象调用format方法得到转换的日期,得到的日期是字符串(可以查看源码)
String format = dateTimeFormatter.format(now);
System.out.println(format);
}
}