LocalDate 的使用

Java常用方法   2025-01-12 04:13   150   0  

一、新时间日期 API 常用、重要对象介绍

  • ZoneId: 时区ID,用来确定 Instant 和 LocalDateTime 互相转换的规则

  • Instant: 用来表示时间线上的一个点(瞬时)

  • LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的

  • LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的

  • LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的

  • Clock: 用于访问当前时刻、日期、时间,用到时区

  • Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔

  • Period: 用于计算两个“日期”间隔

其中,LocalDate、LocalTime、LocalDateTime是新API里的基础对象,绝大多数操作都是围绕这几个对象来进行的,有必要搞清楚:

  • LocalDate : 只含年月日的日期对象

  • LocalTime :只含时分秒的时间对象

  • LocalDateTime : 同时含有年月日时分秒的日期对象

二、获取日期

只对年月日做出处理

// 获取今天的日期
LocalDate today = LocalDate.now();
// 今天是几号
int dayofMonth = today.getDayOfMonth();
// 今天是周几(返回的是个枚举类型,需要再getValue())
int dayofWeek = today.getDayOfWeek().getValue();
// 今年是哪一年
int dayofYear = today.getDayOfYear();

// 根据字符串取:
LocalDate endOfFeb = LocalDate.parse("2018-02-28"); 
// 严格按照yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式 

//TemporalAdjusters里面有更多的特殊日期,诸如一年的第一天(好像并没什么用),一个月的第一天等等
// 取本月第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2018-04-01
// 取本月第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2018-04-02
// 取本月最后一天,再也不用计算是28,29,30还是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2018-04-30
// 取下一天:
LocalDate firstDayOfNextMonth = lastDayOfThisMonth.plusDays(1); // 变成了2018-05-01
// 取2017年1月第一个周一:
LocalDate firstMondayOf2017 = LocalDate.parse("2017-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2017-01-02

三、获取时间

只对时分秒纳秒做出处理
LocalTime只包含时间

// 获得当前时间,包含毫秒
LocalTime now = LocalTime.now();
// 清除毫秒数
LocalTime now = LocalTime.now().withNano(0));
// 00:00:00
LocalTime zero = LocalTime.of(0, 0, 0);
// 12:00:00
LocalTime mid = LocalTime.parse("12:00:00");

构造时间是按照 ISO 格式识别,可以识别以下3种格式:

  • 12:00

  • 12:01:02

  • 12:01:02.345

四、计算时间、日期间隔

//计算两个日期的日期间隔-年月日
LocalDate date1 = LocalDate.of(2018, 2, 13);
LocalDate date2 = LocalDate.of(2017, 3, 12);
//内部是用date2-date1,所以得到的结果是负数
Period period = Period.between(date1, date2);
System.out.println("相差年数 : " + period.getYears());
System.out.println("相差月数 : " + period.getMonths());
System.out.println("相差日数 : " + period.getDays());
//还可以这样获取相差的年月日
System.out.println("-------------------------------");
long years = period.get(ChronoUnit.YEARS);
long months = period.get(ChronoUnit.MONTHS);
long days = period.get(ChronoUnit.DAYS);
System.out.println("相差的年月日分别为 : " + years + "," + months + "," + days);
//注意,当获取两个日期的间隔时,并不是单纯的年月日对应的数字相加减,而是会先算出具体差多少天,在折算成相差几年几月几日的

//计算两个时间的间隔
System.out.println("-------------------------------");
LocalDateTime date3 = LocalDateTime.now();
LocalDateTime date4 = LocalDateTime.of(2018, 1, 13, 22, 30, 10);
Duration duration = Duration.between(date3, date4);
System.out.println(date3 + " 与 " + date4 + " 间隔  " + "\n"
        + " 天 :" + duration.toDays() + "\n"
        + " 时 :" + duration.toHours() + "\n"
        + " 分 :" + duration.toMinutes() + "\n"
        + " 毫秒 :" + duration.toMillis() + "\n"
        + " 纳秒 :" + duration.toNanos() + "\n"
        );
//注意,并没有获得秒差的,但既然可以获得毫秒,秒就可以自行获取了

五、计算程序的运行时间使用时间戳 Instant

Instant start = Instant.now();
for (int i = 0; i < 1000000; i++) {

}
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
System.out.println("运行耗时:" + duration.toMillis() + " 毫秒");

六、LocalDate 格式化

LocalDate 的格式化不要用 SimpleDateFormat 的方法。

LocalDate today = LocalDate.now();
DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String text = today.format(formatters);

需要使用 DateTimeFormatter 来构造格式化模板,然后使用 format 方法,返回的是 String 类型。


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。