JAVA中JDK1.8的LocalDateTime⽇期类的操作⽅法
关键类
Instant:瞬时时间。
LocalDate:本地⽇期,不包含具体时间, 格式 yyyy-MM-dd。
LocalTime:本地时间,不包含⽇期. 格式 yyyy-MM-dd HH:mm:ss.SSS 。
LocalDateTime:组合了⽇期和时间,但不包含时差和时区信息。
ZonedDateTime:最完整的⽇期时间,包含时区和相对UTC或格林威治的时差。
获取当前的⽇期时间
//本地⽇期,不包括时分秒
LocalDate nowDate = w();
//本地⽇期,包括时分秒
LocalDateTime nowDateTime = w();
System.out.println("当前时间:"+nowDate);
System.out.println("当前时间:"+nowDateTime);
//  当前时间:2018-12-19
//  当前时间:2018-12-19T15:24:35.822
获取当前的年⽉⽇时分秒
//获取当前的时间,包括毫秒
LocalDateTime ldt = w();
System.out.println("当前年:"+Year());  //2018
System.out.println("当前年份天数:"+DayOfYear());//172
System.out.println("当前⽉:"+MonthValue());
System.out.println("当前时:"+Hour());
System.out.println("当前分:"+Minute());
System.out.println("当前时间:"+String());
//  当前年:2018
//  当前年份天数:353
//  当前⽉:12
//  当前时:15
//  当前分:24
//  当前时间:2018-12-19T15:24:35.833
格式化时间
LocalDateTime ldt = w();
System.out.println("格式化时间: "+ ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")));
//格式化时间:2018-12-19 15:37:47.119
时间增减
LocalDateTime ldt = w();
System.out.println("后5天时间:"+ldt.plusDays(5));
System.out.println("前5天时间并格式化:"+ldt.minusDays(5).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); //2018-06-16
System.out.println("前⼀个⽉的时间:"+ldt2.minusMonths(1).format(DateTimeFormatter.ofPattern("yyyyMM"))); //2018-06-16
System.out.println("后⼀个⽉的时间:"+ldt2.plusMonths(1)); //2018-06-16
System.out.println("指定2099年的当前时间:"+ldt.withYear(2099)); //2099-06-21T15:07:39.506
/
/  后5天时间:2018-12-24T15:50:37.508
//  前5天时间并格式化:2018-12-14
//  前⼀个⽉的时间:201712
//  后⼀个⽉的时间:2018-02-04T09:19:29.499
//  指定2099年的当前时间:2099-12-19T15:50:37.508
创建指定时间
LocalDate ld3=LocalDate.of(2017, Month.NOVEMBER, 17);
LocalDate ld4=LocalDate.of(2018, 02, 11);
时间相差⽐较
具体相差的年⽉⽇
LocalDate ld=LocalDate.parse("2017-11-17");
LocalDate ld2=LocalDate.parse("2018-01-05");
Period p=Period.between(ld, ld2);
System.out.println("相差年: "+p.getYears()+" 相差⽉ :"+p.getMonths() +" 相差天:"+p.getDays());
// 相差年: 0 相差⽉ :1 相差天:19
注:这⾥的⽉份是不满⾜⼀年,天数是不满⾜⼀个⽉的。这⾥实际相差的是1⽉19天,也就是49天。
相差总数的时间
ChronoUnit ⽇期周期单位的标准集合。也可以计算相差时分秒。
LocalDate startDate = LocalDate.of(2017, 11, 17);
LocalDate endDate = LocalDate.of(2018, 01, 05);
System.out.println("相差⽉份:"+ChronoUnit.MONTHS.between(startDate, endDate));
System.out.println("两⽉之间的相差的天数  : " + ChronoUnit.DAYS.between(startDate, endDate));
/
/        相差⽉份:1
//        两天之间的差在天数  : 49
精度时间相差
Duration 这个类以秒和纳秒为单位建模时间的数量或数量。
Instant inst1 = w();
System.out.println("当前时间戳 : " + inst1);
Instant inst2 = inst1.plus(Duration.ofSeconds(10));
System.out.println("增加之后的时间 : " + inst2);
System.out.println("相差毫秒 : " + Duration.between(inst1, inst2).toMillis());
System.out.println("相毫秒 : " + Duration.between(inst1, inst2).getSeconds());
// 当前时间戳 : 2018-12-19T08:14:21.675Z
/
/ 增加之后的时间 : 2018-12-19T08:14:31.675Z
// 相差毫秒 : 10000
// 相毫秒 : 10
时间⼤⼩⽐较
LocalDateTime ldt4 = w();
LocalDateTime ldt5 = ldt4.plusMinutes(10);
System.out.println("当前时间是否⼤于:"+ldt4.isAfter(ldt5));
System.out.println("当前时间是否⼩于"+ldt4.isBefore(ldt5));
// false
// true
时区时间计算
得到其他时区的时间。
通过Clock时钟类获取计算
Clock时钟类⽤于获取当时的时间戳,或当前时区下的⽇期时间信息。
java时间日期格式转换Clock clock = Clock.systemUTC();
System.out.println("当前时间戳 : " + clock.millis());
Clock clock2 = Clock.system(ZoneId.of("Asia/Shanghai"));
System.out.println("亚洲上海此时的时间戳:"+clock2.millis());
Clock clock3 = Clock.system(ZoneId.of("America/New_York"));
System.out.println("美国纽约此时的时间戳:"+clock3.millis());
//  当前时间戳 : 1545209277657
//  亚洲上海此时的时间戳:1545209277657
/
/  美国纽约此时的时间戳:1545209277658
通过ZonedDateTime类和ZoneId
ZoneId zoneId= ZoneId.of("America/New_York");
ZonedDateTime w(zoneId);
System.out.println("美国纽约此时的时间 : " + dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")));
System.out.println("美国纽约此时的时间和时区: " + dateTime);
//  美国纽约此时的时间 : 2018-12-19 03:52:22.494
// 美国纽约此时的时间和时区: 2018-12-19T03:52:22.494-05:00[America/New_York]
Java 8⽇期时间API总结:
提供了javax.time.ZoneId 获取时区。
提供了LocalDate和LocalTime类。
Java 8 的所有⽇期和时间API都是不可变类并且线程安全,⽽现有的Date和Calendar API中的java.util.Date和SimpleDateFormat是⾮线程安全的。
主包是 java.time,包含了表⽰⽇期、时间、时间间隔的⼀些类。⾥⾯有两个⼦包java.time.format⽤于格式化, poral⽤于更底层的操作。
时区代表了地球上某个区域内普遍使⽤的标准时间。每个时区都有⼀个代号,格式通常由区域/城市构成(Asia/Tokyo),在加上与格林威治或 UTC的时差。例如:东京的时差是+09:00。
OffsetDateTime类实际上组合了LocalDateTime类和ZoneOffset类。⽤来表⽰包含和格林威治或UTC时差的完整⽇期(年、⽉、⽇)和时间(时、分、秒、纳秒)信息。
DateTimeFormatter 类⽤来格式化和解析时间。与SimpleDateFormat不同,这个类不可变并且线程安全,需要时可以给静态常量赋值。DateTimeFormatter类提供了⼤量的内置格式化⼯具,同时也允许你⾃定义。在转换⽅⾯也提供了parse()将字符串解析成⽇期,如果解析出错会抛出DateTimeParseException。DateTimeFormatter类同时还有format()⽤来格式化⽇期,如果出错会抛出
DateTimeException异常。
再补充⼀点,⽇期格式“MMM d yyyy”和“MMM dd yyyy”有⼀些微妙的不同,第⼀个格式可以解析“Jan 2
2014”和“Jan 14 2014”,⽽第⼆个在解析“Jan 2 2014”就会抛异常,因为第⼆个格式⾥要求⽇必须是两位的。如果想修正,你必须在⽇期只有个位数时在前⾯补零,就是说“Jan 2 2014”应该写成 “Jan 02 2014”。