一、Date、LocalDate、LocalTime和LocalDateTime特点
1、java.util.Date
功能强大,包含日期、时间,还有毫秒数
对时间的一些操作还需配合Calendar写一些代码
月份从0开始,一月是0,十二月是11
java.util.Date和SimpleDateFormatter都不是线程安全的
2、java.time.LocalDate、LocalTime和LocalDateTime
LocalDate只包含日期,LocalTime只包含时间,LocalDateTime同时包含日期和时间
对时间的操作灵活,方法很多
java.time.LocalDate月份和星期都改成了枚举类,不易出错
线程安全,且不能修改
二、java.time.LocalDate、LocalTime和LocalDateTime
1、LocalDate
private static void localDateDemo() {
//当前日期
LocalDate today = LocalDate.now();
System.out.println("当前日期:" + today);
//根据年月日创建日期
LocalDate ofDay = LocalDate.of(2020, 05, 20);
System.out.println("年月日创建日期:" + ofDay);
//根据字符串创建日期
LocalDate parseDay = LocalDate.parse("2020-05-20");
System.out.println("字符串创建日期:" + parseDay);
//本月第一天
LocalDate firstDayOfMonth = today.with(TemporalAdjusters.firstDayOfMonth());
System.out.println("本月第一天:" + firstDayOfMonth);
//本月第二天
LocalDate secondDayOfMonth = today.withDayOfMonth(2);
System.out.println("本月第二天:" + secondDayOfMonth);
//本月最后一天
LocalDate lastDayOfMonth = today.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("本月最后一天:" + lastDayOfMonth);
//明天
LocalDate tomorrow = today.plusDays(1);
System.out.println("明天:" + tomorrow);
//2020年5月第一个周一
LocalDate firstMonday = LocalDate.parse("2020-05-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
System.out.println("2020年5月第一个周一:" + firstMonday);
//比较日期
LocalDate lastDayOfYear = today.with(TemporalAdjusters.lastDayOfYear());
Period period = today.until(lastDayOfYear);
System.out.println("距离年底"+ lastDayOfYear +"还有" + period.getYears() + "年"+period.getMonths()+ "月"+period.getDays()+ "日");
}
运行结果
当前日期:2020-05-26
年月日创建日期:2020-05-20
字符串创建日期:2020-05-20
本月第一天:2020-05-01
本月第二天:2020-05-02
本月最后一天:2020-05-31
明天:2020-05-27
2020年5月第一个周一:2020-05-04
距离年底2020-12-31还有0年7月5日
2、LocalTime
private static void localTimeDemo() {
//当前时间(含毫秒)
LocalTime localTime = LocalTime.now();
System.out.println("当前时间(含毫秒):" + localTime);
//当前时间(不含毫秒)
LocalTime localTimeWithNano = LocalTime.now().withNano(0);
System.out.println("当前时间(不含毫秒):" + localTimeWithNano);
//根据时分秒创建时间
LocalTime ofTime = LocalTime.of(13, 14, 20);
System.out.println("时分秒创建时间:" + ofTime);
//根据字符串创建时间(字符串按照ISO格式识别,可识别13:14、13:14:20、13:14:20.123)
LocalTime parseTime = LocalTime.parse("13:14:20");
System.out.println("字符串创建时间:" + parseTime);
}
运行结果
当前时间(含毫秒):16:13:15.947
当前时间(不含毫秒):16:13:15
时分秒创建时间:13:14:20
字符串创建时间:13:14:20
3、LocalDateTime
private static void localDateTimeDemo() {
//获取当前时间
LocalDateTime today = LocalDateTime.now();
System.out.println("当前时间:" + today);
//根据LocalDate、LocalTime创建时间
LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), LocalTime.now());
System.out.println("当前时间:" + localDateTime);
//根据年月日时分秒创建时间
LocalDateTime ofLocalDateTime = LocalDateTime.of(2020, Month.MAY, 20, 13, 14, 20);
System.out.println("根据年月日时分秒创建时间:" + ofLocalDateTime);
//根据字符串创建时间
LocalDateTime parseLocalDateTime = LocalDateTime.parse("2020-05-20T13:14:20");
System.out.println("根据字符串创建时间:" + parseLocalDateTime);
//巴黎时间
LocalDateTime todayKolkata = LocalDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println("巴黎当前时间:" + todayKolkata);
//获取当前年份是否是闰年
System.out.println("今天" + today.getYear() + "年是闰年? " + today.toLocalDate().isLeapYear());
//比较两个日期的先后
System.out.println("今天在2019-01-01之前? " + today.isBefore(LocalDateTime.of(2019,1, 1, 1, 1)));
//一天后
System.out.println("一天后:" + today.plusDays(1));
//一周后
System.out.println("一周后:" + today.plusWeeks(1));
//一月后
System.out.println("一月后:" + today.plusMonths(1));
//一天前
System.out.println("一天前:" + today.minusDays(1));
//一周前
System.out.println("一周前:" + today.minusWeeks(1));
//一月前
System.out.println("一月前:" + today.minusMonths(1));
//LocalDateTime转换为String
String formatTime = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("LocalDateTime转换为String:" + formatTime);
//LocalDateTime转换为Date
Date date = Date.from(today.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("LocalDateTime转换为Date:" + date);
}
运行结果
当前时间:2020-05-26T16:13:15.948
当前时间:2020-05-26T16:13:15.948
根据年月日时分秒创建时间:2020-05-20T13:14:20
根据字符串创建时间:2020-05-20T13:14:20
巴黎当前时间:2020-05-26T10:13:15.949
今天2020年是闰年? true
今天在2019-01-01之前? false
一天后:2020-05-27T16:13:15.948
一周后:2020-06-02T16:13:15.948
一月后:2020-06-26T16:13:15.948
一天前:2020-05-25T16:13:15.948
一周前:2020-05-19T16:13:15.948
一月前:2020-04-26T16:13:15.948
LocalDateTime转换为String:2020-05-26 16:13:15
LocalDateTime转换为Date:Tue May 26 16:13:15 CST 2020
4、ZonedDateTime
private static void zonedDateTimeDemo() {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("当前时间(带时区):" + zonedDateTime);
ZonedDateTime zonedDateTimeNoplace = ZonedDateTime.now();
System.out.println("当前时间(带时区不带区名):" + zonedDateTimeNoplace.withFixedOffsetZone());
ZonedDateTime zonedDateTime2 = ZonedDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println("当前时间(指定时区):"+zonedDateTime2);
}
运行结果
当前时间(带时区):2020-05-26T16:13:15.949+08:00[Asia/Shanghai]
当前时间(带时区不带区名):2020-05-26T16:13:15.949+08:00
当前时间(指定时区):2020-05-26T10:13:15.949+02:00[Europe/Paris]
文章仅作为个人学习整理