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 plusLocalDateTime加上指定数量的时间得到的值
2plusDays LocalDateTime加上指定天数得到的值
3plusHoursLocalDateTime加上指定小时数得到的值
4plusMinutesLocalDateTime加上指定分钟数得到的值
5plusMonthsLocalDateTime加上指定月数得到的值
6plusNanosLocalDateTime加上指定纳秒数得到的值
7plusSeconds  LocalDateTime加上指定秒数得到的值
8plusWeeks        LocalDateTime加上指定星期数得到的值
9plusYearsLocalDateTime加上指定年数得到的值
10withLocalDateTime指定字段更改为新值后的拷贝
11withDayOfMonthLocalDateTime月的第几天更改为新值后的拷贝
12withDayOfYearLocalDateTime年的第几天更改为新值后的拷贝
13withHourLocalDateTime小时数更改为新值后的拷贝
14withMinuteLocalDateTime分钟数更改为新值后的拷贝
15withMonth       LocalDateTime月份更改为新值后的拷贝
16withNanoLocalDateTime纳秒数更改为新值后的拷贝
17withSecond      LocalDateTime秒数更改为新值后的拷贝
18withYear        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、获取时间属性值

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

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

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

其他
16until         计算LocalDateTime和另一个LocalDateTime之间的时间差,可以指定时间单位(ChronoUnit)其他
17adjustInto    将目标对象调整为指定的时间对象,指定对象调用方法,目标对象作为参数其他
18query         使用指定的查询查询此日期时间,查询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<String> 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。

 

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值