简介
伴随 lambda表达式、 streams 以及一系列小优化,Java 8 推出了全新的日期时间API。
Java处理日期、日历和时间的不足之处:将 java.util.Date 设定为可变类型,以及 SimpleDateFormat的非线程安全使其应用非常受限。然后就在 java8 上面增加新的特性。
全新API的众多好处之一就是,明确了日期时间概念,例如: 瞬时(instant)、 长短(duration)、 日期、 时间、 时区和周期。
同时继承了Joda库按人类语言和计算机各自解析的时间处理方式。不同于老版本,新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。
关键类
-
Instant:瞬时实例。
-
LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。
-
LocalTime:本地时间,不包含日期。
-
LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
-
ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。
新API还引入了 ZoneOffSet 和 ZoneId 类,使得解决时区问题更为简便。解析、格式化时间的
DateTimeFormatter\ 类也全部重新设计。
实战
1.获取今天的日期
@Test
public void getCurrentDate(){
LocalDate today = LocalDate.now();
System.out.println("Java8's Local date : " + today);
//这个是老版本
Date date = new Date();
System.out.println("Old version date : "+date);
}
2. 获取年、月、日信息
public void getDetailDate(){
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("Year : %d \nMonth : %d \nday : %d ", year, month, day);
}
3. 处理特定日期
public void handleSpecilDate(){
LocalDate dateOfBirth = LocalDate.of(2020, 01, 23);
System.out.println("The specil date is : " + dateOfBirth);
}
3. 判断两个日期是否相等
public void compareDate(){
LocalDate today = LocalDate.now();
LocalDate date1 = LocalDate.of(2020, 01, 23);
if(date1.equals(today)){
System.out.printf("TODAY %s and DATE1 %s are same date %n", today, date1);
}else{
System.out.printf("TODAY %s and DATE1 %s are not same date %n", today, date1);
}
}
4. 处理周期性的日期
public void cycleDate(){
LocalDate today = LocalDate.now();
LocalDate dateOfBirth = LocalDate.of(2020, 01, 23);
//某月某日
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(today);
if(currentMonthDay.equals(birthday)){
System.out.println("Many Many happy returns of the day !!");
}else{
System.out.println("Sorry, today is not your birthday");
}
}
5. 获取当前时间
public void getCurrentTime(){
LocalTime time = LocalTime.now();
System.out.println("local time now : " + time);
}
6. 时间延迟或提前两小时
public void plusHours(){
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(2); // 增加两小时
System.out.println("Time after 2 hours : " + newTime);
newTime = time.plusHours(-2);// 减少两小时
//newTime = time.minusHours(2);//当然也可以用minusHours方法实现上行代码同样效果
System.out.println("Time before 2 hours : " + newTime);
}
7. 计算一周后的日期
public void nextWeek(){
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("Today is : " + today);
System.out.println("Date after 1 week : " + nextWeek);
}
8. 计算一年前或一年后的日期
public void minusDate(){
LocalDate today = LocalDate.now();
LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
System.out.println("Date before 1 year : " + previousYear);
LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
System.out.println("Date after 1 year : " + nextYear);
}
9. 获取时钟
public void clock(){
// 根据系统时间返回当前时间并设置为UTC。
Clock clock = Clock.systemUTC();
System.out.println("Clock : " + clock);
// 根据系统时钟区域返回时间
Clock defaultClock = Clock.systemDefaultZone();
System.out.println("Clock : " + clock);
}
10. 用Java判断日期是早于还是晚于另一个日期
public void isBeforeOrIsAfter(){
LocalDate today = LocalDate.now();
LocalDate tomorrow = LocalDate.of(2020, 1, 29);
if(tomorrow.isAfter(today)){
System.out.println("Tomorrow comes after today");
}
LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
if(yesterday.isBefore(today)){
System.out.println("Yesterday is day before today");
}
}
11. 时区处理
public void getZoneTime(){
//设置时区
ZoneId america = ZoneId.of("America/New_York");
LocalDateTime localtDateAndTime = LocalDateTime.now();
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america );
System.out.println("现在的日期和时间在特定的时区 : " + dateAndTimeInNewYork);
}
12. 使用 YearMonth类处理特定的日期
public void checkCardExpiry(){
YearMonth currentYearMonth = YearMonth.now();
System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
YearMonth creditCardExpiry = YearMonth.of(2028, Month.FEBRUARY);
System.out.printf("Your credit card expires on %s %n", creditCardExpiry);
}
13. 检查闰年
public void isLeapYear(){
LocalDate today = LocalDate.now();
if(today.isLeapYear()){
System.out.println("This year is Leap year");
}else {
System.out.println("2020 is not a Leap year");
}
}
14. 计算两个日期之间的天数和月数
public void calcDateDays(){
LocalDate today = LocalDate.now();
LocalDate java8Release = LocalDate.of(2020, Month.MAY, 14);
Period periodToNextJavaRelease = Period.between(today, java8Release);
System.out.println("Months left between today and Java 8 release : "
+ periodToNextJavaRelease.getMonths() );
}
15. 包含时差信息的日期和时间
public void ZoneOffset(){
LocalDateTime datetime = LocalDateTime.of(2020, Month.FEBRUARY, 14, 19, 30);
ZoneOffset offset = ZoneOffset.of("+05:30");
OffsetDateTime date = OffsetDateTime.of(datetime, offset);
System.out.println("Date and Time with timezone offset in Java : " + date);
}
16. 获取时间戳
public void getTimestamp(){
Instant timestamp = Instant.now();
System.out.println(""What's the value of this instant : "" + timestamp);
}
17. 使用预定义的格式化工具去解析或格式化日期
public void formateDate(){
String dayAfterTommorrow = "20200123";
LocalDate formatted = LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE);
System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted);
}