java.time包下的所有类都是不可变类型而且线程安全, java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限
编号 | 类的名称 | 描述 |
---|---|---|
1 | Instant | 时间戳 |
2 | Duration | 持续时间,时间差 |
3 | LocalDate | 只包含日期,例如2020-05-04 |
4 | LocalTime | 只包含时间,例如23:12:10 |
5 | LocalDateTime | 包含日期和时间,例如2020-05-04 23:12:10 |
6 | Period | 时间段 |
7 | ZonedOffset | 时区偏移量,例如+8:00 |
8 | ZonedDateTime | 带时区的时间 |
9 | Clock | 时钟,获取当前北京时间 |
示例1:获取今天的日期
只有日期,不包含时间
LocalDate today = LocalDate.now();
System.out.println("今天的日期:"+today);//今天的日期:2022-06-01
示例2:获取年、月、日信息
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.println("year:"+year);//year:2022
System.out.println("month:"+month);//month:6
System.out.println("day:"+day);//day:1
示例3:处理特定日期
LocalDate date = LocalDate.of(2022,6,1);
System.out.println("自定义日期:"+date);//自定义日期:2022-06-01
示例4:判断两个日期是否相等
LocalDate date1 = LocalDate.now();
LocalDate date2 = LocalDate.of(2022,6,1);
if(date1.equals(date2)){
System.out.println("时间相等");
}else{
System.out.println("时间不等");
}
示例5:检查像生日这种周期性事件
LocalDate date1 = LocalDate.now();
LocalDate date2 = LocalDate.of(2022,6,1);
MonthDay birthday = MonthDay.of(date2.getMonth(),date2.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(date1);
if(currentMonthDay.equals(birthday)){
System.out.println("是你的生日");
}else{
System.out.println("你的生日还没有到");
}
示例6:获取当前时间
LocalTime time = LocalTime.now();
System.out.println("获取当前的时间,不含有日期:"+time);//获取当前的时间,不含有日期:15:08:58.332
示例7:中获取当前时间
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(3);
System.out.println("三个小时后的时间为:"+newTime);三个小时后的时间为:18:09:29.957
示例8:如何计算一周后的日期
LocalDate today = LocalDate.now();
System.out.println("今天的日期为:"+today);//今天的日期为:2022-06-01
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("一周后的日期为:"+nextWeek);//一周后的日期为:2022-06-08
示例9:计算一年前或一年后的日期
LocalDate today = LocalDate.now();
LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
System.out.println("一年前的日期 : " + previousYear);//一年前的日期 : 2021-06-01
LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
System.out.println("一年后的日期:"+nextYear);//一年后的日期:2023-06-01
示例10:Clock时钟类
Clock clock = Clock.systemUTC();
System.out.println("Clock : " + clock.millis());//Clock : 1654067470198
Clock defaultClock = Clock.systemDefaultZone();
System.out.println("Clock : " + defaultClock.millis());//Clock : 1654067470260
示例11:如何用Java判断日期是早于还是晚于另一个日期
LocalDate today = LocalDate.now();
LocalDate tomorrow = LocalDate.of(2022,6,1);
if(tomorrow.isAfter(today)){
System.out.println("之后的日期:"+tomorrow);
}
LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
if(yesterday.isBefore(today)){
System.out.println("之前的日期:"+yesterday);//之前的日期:2022-05-31
}
示例12:处理时区
ZoneId america = ZoneId.of("America/New_York");
LocalDateTime localtDateAndTime = LocalDateTime.now();
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america );
System.out.println("特定时区中的当前日期和时间: " + dateAndTimeInNewYork);
//特定时区中的当前日期和时间: 2022-06-01T15:13:59.227-04:00[America/New_York]
示例13:如何表示信用卡到期这类固定日期,答案就在YearMonth
YearMonth currentYearMonth = YearMonth.now();
System.out.printf("年月天数 %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
//年月天数 2022-06: 30
YearMonth creditCardExpiry = YearMonth.of(2019, Month.FEBRUARY);
System.out.printf("您的信用卡于 %s 到期", creditCardExpiry);//您的信用卡于 2019-02 到期
示例13:检查闰年
LocalDate today = LocalDate.now();
if(today.isLeapYear()){
System.out.println("今年是闰年");
}else {
System.out.println("2022年不是闰年");//2022年不是闰年
}
示例15:计算两个日期之间的天数和月数
LocalDate today = LocalDate.now();
LocalDate java8Release = LocalDate.of(2022, 7, 1);
Period periodToNextJavaRelease = Period.between(today, java8Release);
System.out.println("从7月1日到今天还有几个月 : "+ periodToNextJavaRelease.getMonths());
//从7月1日到今天还有几个月 : 1
示例16:获取当前的时间戳
Instant timestamp = Instant.now();
System.out.println("瞬间值是 " + timestamp.toEpochMilli());//瞬间值是 1654068000333
示例17:如何使用预定义的格式化工具去解析或格式化日期
String dayAfterTommorrow = "20220601";
LocalDate formatted = LocalDate.parse(dayAfterTommorrow,
DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(dayAfterTommorrow+" 格式化后的日期为: "+formatted);
//20220601 格式化后的日期为: 2022-06-01
示例18:字符串互转日期类型
LocalDateTime date = LocalDateTime.now();
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
//日期转字符串
String str = date.format(format1);
System.out.println("日期转换为字符串:"+str);//日期转换为字符串:2022/06/01 15:21:27
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
//字符串转日期
LocalDate date2 = LocalDate.parse(str,format2);
System.out.println("日期类型:"+date2);//日期类型:2022-06-01