JAVA8 LocalDate使用指南

目录

1、初始化

2、获取指定时间

3、时间操作

4、获取时间属性值

5、时间格式之间相互转换

5.1、LocalDateTime与String

5.2、时间戳与LocalDate、LocalDateTime之间相互转换

5.3、Date与LocalDate、LocalDateTime之间相互转换

5.4、Date与LocalDate、LocalDateTime之间相互转换

6、其他方法

7、时区

8、Instant(时间点)

 


LocalDateTime表示日期和时间,LocalDate用来表示日期,LocalTIme表示时间,LocalDateTime = LocalDate + LocalTIme。

System.out.println(LocalDate.now());
System.out.println(LocalTime.now());
System.out.println(LocalDateTime.now());

/*打印结果:
2020-04-02
11:29:52.206
2020-04-02T11:29:52.206
*/

1、初始化

LocalDateTime可以分别获取LocalDate和LocalTime:

(1)toLocalDate 返回LocalDateTime的LocalDate部分

(2)toLocalTime 返回LocalDateTime的LocalTime部分

LocalDateTime now = LocalDateTime.now();
System.out.println(now);
LocalDate localDate = now.toLocalDate();
System.out.println(localDate);
LocalTime localTime = now.toLocalTime();
System.out.println(localTime);

/*打印结果:
2020-04-02T13:57:43.990
2020-04-02
13:57:43.990
*/

2、获取指定时间

LocalTime.of(int hour,int minute,int second):指定时、分、秒,参数不可缺省

LocalDate.of(int year,int mouth,int day):指定年、月、日,参数不可缺省,这里指定月份的话是从1开始,与Calendar不同,Calendar的月份是从0开始,这也就是LocalDate比Calendar处理时间要方便的多

LocalDate.of(int year,MOUTH mouth,int day)

LocalDateTime.of(nt year,int mouth,int day,int hour,int minute,int second,int nanoOfSecond):指定年、月、日、时、分、秒、纳秒,参数可缺省

LocalDateTime.of(nt year,MOUTH mouth,int day,int hour,int minute,int second,int nanoOfSecond)

LocalDateTime.of(LocalDate localDate,LocalTime localTime)

System.out.println(LocalDate.of(2020,12,1));
System.out.println(LocalDate.of(2020, Month.APRIL,23));
System.out.println(LocalTime.of(12,23,33));
System.out.println(LocalDateTime.of(LocalDate.now(),LocalTime.now()));
System.out.println(LocalDateTime.of(2322,12,22,23,12,33,232));
System.out.println(LocalDateTime.of(2322,Month.JULY,22,23,12,33,232));

/*打印结果:
2020-12-01
2020-04-23
12:23:33
2020-04-02T11:48:20.785
2322-12-22T23:12:33.000000232
2322-07-22T23:12:33.000000232
*/

3、时间操作

这里以LocalDateTime进行举例说明

序号 函数 返回 描述
1  plus LocalDateTime 加上指定数量的时间得到的值
2 plusDays  LocalDateTime 加上指定天数得到的值
3 plusHours LocalDateTime 加上指定小时数得到的值
4 plusMinutes LocalDateTime 加上指定分钟数得到的值
5 plusMonths LocalDateTime 加上指定月数得到的值
6 plusNanos LocalDateTime 加上指定纳秒数得到的值
7 plusSeconds   LocalDateTime 加上指定秒数得到的值
8 plusWeeks         LocalDateTime 加上指定星期数得到的值
9 plusYears LocalDateTime 加上指定年数得到的值
10 with LocalDateTime 指定字段更改为新值后的拷贝
11 withDayOfMonth LocalDateTime 月的第几天更改为新值后的拷贝
12 withDayOfYear LocalDateTime 年的第几天更改为新值后的拷贝
13 withHour LocalDateTime 小时数更改为新值后的拷贝
14 withMinute LocalDateTime 分钟数更改为新值后的拷贝
15 withMonth        LocalDateTime 月份更改为新值后的拷贝
16 withNano LocalDateTime 纳秒数更改为新值后的拷贝
17 withSecond       LocalDateTime 秒数更改为新值后的拷贝
18 withYear         LocalDateTime 年份更改为新值后的拷贝

说明:1、plus是增加相应时间单位的水量,minus是减少相应时间单位的数量,此处不再说明;

           2、表中的拷贝实际就是对相应时间位置的数值进行修改。

LocalDateTime now = LocalDateTime.now();
        System.out.println(now);
        System.out.println(now.plusYears(1)
                .plusMonths(1L)
                .plusWeeks(1)
                .plusDays(1)
                .plusHours(1)
                .plusMinutes(1)
                .plusSeconds(1)
                .plusNanos(500000L));

/*打印结果:
2020-04-02T12:04:22.507
2021-05-10T13:05:23.507500
*/

        System.out.println(now);
//        半天
        System.out.println(now.plus(2, ChronoUnit.HALF_DAYS));
//        世纪
        System.out.println(now.plus(2, ChronoUnit.CENTURIES));
//        十年
        System.out.println(now.plus(2, ChronoUnit.DECADES));
//        千年,执行不成功
        System.out.println(now.plus(2, ChronoUnit.MILLENNIA));
//        永恒,执行不成功
        System.out.println(now.plus(1, ChronoUnit.FOREVER));
//        微秒,执行不成功
        System.out.println(now.plus(1, ChronoUnit.MICROS));
//        时代,执行不成功
        System.out.println(now.plus(1, ChronoUnit.ERAS));

LocalDate date = LocalDate.of(2020, 2, 22); // 2020-02-22
LocalDate date1 = date.withYear(2021); // 修改为 2021-02-22
LocalDate date2 = date.withMonth(3); // 修改为 2020-03-22 
LocalDate date3 = date.withDayOfMonth(1); // 修改为 2020-02-01

4、获取时间属性值

序号 函数 描述
1 get              得到LocalDateTime的指定字段的值
2 getDayOfMonth 得到LocalDateTime是月的第几天
3 getDayOfWeek  得到LocalDateTime是星期几
4 getDayOfYear     得到LocalDateTime是年的第几天
5 getHour 得到LocalDateTime的小时
6 getLong          得到LocalDateTime指定字段的值
7 getMinute        得到LocalDateTime的分钟
8 getMonth         得到LocalDateTime的月份,获取的结果是月份的枚举值
9 getMonthValue    得到LocalDateTime的月份,从1到12
10 getNano         得到LocalDateTime的纳秒数
11 getSecond       得到LocalDateTime的秒数
12 getYear         得到LocalDateTime的年份

 

5、时间格式之间相互转换

5.1、LocalDateTime与String

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒SSS毫秒");
LocalDateTime localDateTime = LocalDateTime.now();
String dateStr = dateTimeFormatter.format(localDateTime);
System.out.println(dateStr); \\2020年04月02日 14时11分01秒623毫秒
LocalDateTime localDateTime2 = LocalDateTime.parse(dateStr, dateTimeFormatter);
System.out.println(localDateTime2); \\ 2020-04-02T14:11:01.623
LocalDate localDate = LocalDate.parse(dateStr, dateTimeFormatter);
System.out.println(localDate); \\2020-04-02
LocalTime localTime = LocalTime.parse(dateStr, dateTimeFormatter);
System.out.println(localTime); \\14:11:01.623

5.2、时间戳与LocalDate、LocalDateTime之间相互转换

long timestamp = Instant.now().toEpochMilli();
LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
System.out.println(timestamp +"====>"+ localDateTime );
timestamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
System.out.println(localDateTime +"====>"+ timestamp );
// 注意秒和毫秒之间的区别
timestamp = LocalDateTime.now().atZone(ZoneOffset.ofHours(8)).toEpochSecond();
localDateTime = Instant.ofEpochSecond(timestamp).atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
System.out.println(timestamp +"====>"+ localDateTime );

5.3、Date与LocalDate、LocalDateTime之间相互转换

LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());
localDateTime = date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
System.out.println(date + "======>" + localDateTime);

/*打印结果:
2020-04-02T14:27:40.230
Thu Apr 02 14:27:40 CST 2020======>2020-04-02T14:27:40.230
*/

5.4、Date与LocalDate、LocalDateTime之间相互转换

LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());
localDateTime = date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
System.out.println(date + "======>" + localDateTime);

/*打印结果:
2020-04-02T14:27:40.230
Thu Apr 02 14:27:40 CST 2020======>2020-04-02T14:27:40.230
*/

6、其他方法

序号 函数 描述 类别
1 atOffset      结合LocalDateTime和ZoneOffset创建一个OffsetDateTime 时区相关
2 atZone        结合LocalDateTime和指定时区创建一个ZonedDateTime 时区相关
3 ofEpochSecond  根据秒数(从1970-01-0100:00:00开始)创建LocalDateTime 实例方法
4 ofInstant      根据Instant和ZoneId创建LocalDateTime 实例方法
5 compareTo      比较两个LocalDateTime,小于返回-1,等于返回0,大于返回1 比较方法
6 isAfter        判断LocalDateTime是否在指定LocalDateTime之后 比较方法
7 isBefore       判断LocalDateTime是否在指定LocalDateTime之前 比较方法
8 isEqual        判断两个LocalDateTime是否相等 比较方法
9 format          格式化LocalDateTime生成一个字符串 格式化方法
10 from            转换TemporalAccessor为LocalDateTime 格式化方法
11 parse           解析字符串得到LocalDateTime 格式化方法
12 isSupported    判断LocalDateTime是否支持指定时间字段或单元 其他
13 toString       返回LocalDateTime的字符串表示 其他
14 range          返回指定时间字段的数值范围范围(ChronoField) 其他
15 truncatedTo   

返回LocalDateTime截取到指定时间单位的拷贝,如果无法截断抛DateTimeException,如果不支持截断单位抛UnsupportedTemporalTypeException

其他
16 until          计算LocalDateTime和另一个LocalDateTime之间的时间差,可以指定时间单位(ChronoUnit) 其他
17 adjustInto     将目标对象调整为指定的时间对象,指定对象调用方法,目标对象作为参数 其他
18 query          使用指定的查询查询此日期时间,查询LocalDateTime(TemporalQueries) 其他
LocalDateTime now = LocalDateTime.now();
System.out.println("当前时间:" + now);
LocalDateTime from = LocalDateTime.of(2020, 4, 1, 0, 0, 0, 0);
System.out.println(from.until(now, ChronoUnit.HOURS));
/*打印结果:
当前时间:2020-04-03T14:40:39.048
62
*/

LocalDateTime date = LocalDateTime.parse("2014-12-03T10:15:30");
System.out.printf("LocalDateTime precision is %s%n",
zonedDateTime.query(TemporalQueries.precision()));
/*打印结果:
LocalDateTime precision is Nanos
*/
ZonedDateTime date = ZonedDateTime.now();
System.out.println(date);
LocalTime standard = LocalTime.parse("10:30:30");
date = (ZonedDateTime)standard.adjustInto(date);
System.out.println(date);
/*打印结果:
2020-04-03T15:03:31.579+08:00[Asia/Shanghai]
2020-04-03T10:30:30+08:00[Asia/Shanghai]
*/

7、时区

对失去处理的优化也是java8中日期时间API的一大亮点。旧的java.util.TimeZone提供的时区不全不说,操作还非常繁琐,新的时区类java.time.ZoneId是原有的java.util.TimeZone类的替代品。ZoneId对象可以通过ZoneId.of()方法创建,也可以通过ZoneId.systemDefault()获取系统默认时区。

ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");
ZoneId systemZoneId = ZoneId.systemDefault();

of()方法接收一个“区域/城市”的字符串作为参数,你可以通过getAvailableZoneIds()方法获取所有合法的“区域/城市”字符串:

Set zoneIds = ZoneId.getAvailableZoneIds();

对于老的时区类TimeZone,Java 8也提供了转化方法:

ZoneId oldToNewZoneId = TimeZone.getDefault().toZoneId();

有了ZoneId,我们就可以将一个LocalDate、LocalTime或LocalDateTime对象转化为ZonedDateTime对象:

LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, shanghaiZoneId);

将zonedDateTime打印到控制台为:

2020-02-22T16:50:54.658+08:00[Asia/Shanghai]

ZonedDateTime对象由两部分构成,LocalDateTime和ZoneId,其中2020-02-22T16:50:54.658部分为LocalDateTime,+08:00[Asia/Shanghai]部分为ZoneId。另一种表示时区的方式是使用ZoneOffset,它是以当前时间和世界标准时间(UTC)/格林威治时间(GMT)的偏差来计算,例如:

ZoneOffset zoneOffset = ZoneOffset.of("+09:00");
LocalDateTime localDateTime = LocalDateTime.now();
OffsetDateTime offsetDateTime = OffsetDateTime.of(localDateTime, zoneOffset);

8、Instant(时间点)

Instant是时间线上的一个点,表示一个时间戳。Instant可以精确到纳秒,这超过了long的最大表示范围,所以在Instant的实现中是分成了两部分来表示,一部分是seconds,表示从1970-01-01 00:00:00开始到现在的秒数,另一个部分是nanos,表示纳秒部分。以下是创建Instant的两种方法:

Instant now = Instant.now(); 
//获取当前时刻的时间戳,结果为:2020-04-02T07:30:23.811Z;
Instant instant = Instant.ofEpochSecond(600, 1000000);
//ofEpochSecond()方法的第一个参数为秒,第二个参数为纳秒,上面的代码表示从1970-01-01 00:00:00开始后一分钟的10万纳秒的时刻,
//其结果为:1970-01-01T00:10:00.001Z。

 

你可能感兴趣的:(JAVA)