jdk 1.8 之前, Java 时间使用java.util.Date 和 java.util.Calendar 类。
Date today = new Date(); System.out.println(today); // 转为字符串 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String todayStr = sdf.format(today); System.out.println(todayStr);Date 的几个问题:
如果不格式化,Date打印出的日期可读性差;
可以使用 SimpleDateFormat 对时间进行格式化,但 SimpleDateFormat 是线程不安全的(阿里巴巴开发手册中禁用static修饰SimpleDateFormat);
Date对时间处理比较麻烦,比如想获取某年、某月、某星期,以及 n 天以后的时间,如果用Date来处理的话真是太难了,并且 Date 类的 getYear()、getMonth() 这些方法都被弃用了;
二、JDK 1.8 新的日期时间类型Java8引入的新的一系列API,对时间日期的处理提供了更好的支持,清楚的定义了时间日期的一些概念,比如说,瞬时时间(Instant),持续时间(duration),日期(date),时间(time),时区(time-zone)以及时间段(Period)。
LocalDate:不包含时间的日期,比如2019-10-14。可以用来存储生日,周年纪念日,入职日期等。
LocalTime:与LocalDate想对照,它是不包含日期的时间。
LocalDateTime:包含了日期及时间,没有偏移信息(时区)。
ZonedDateTime:包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
Instant:时间戳,与System.currentTimeMillis()类似。
Duration:表示一个时间段。
Period:用来表示以年月日来衡量一个时间段。
DateTimeFormatter:新的日期解析格式化类。
2.1 LocalDateLocalDate类内只包含日期,不包含具体时间。只需要表示日期而不包含时间,就可以使用它。
public static void localDate() { //获取当前年月日 LocalDate today = LocalDate.now(); System.out.println("当前年月日:" + today); // 获取年的两种方式 int thisYear = today.getYear(); int thisYearAnother = today.get(ChronoField.YEAR); System.out.println("今年是" + thisYear + "年"); System.out.println("今年是" + thisYearAnother + "年"); // 获取月 Month thisMonth = today.getMonth(); System.out.println(thisMonth.toString()); // 这是今年的第几个月(两种写法) int monthOfYear = today.getMonthValue(); // int monthOfYear = today.get(ChronoField.MONTH_OF_YEAR); System.out.println("这个月是今年的第" + monthOfYear + "个月"); // 月份的天数 int length = today.lengthOfMonth(); System.out.println("这个月有" + length + "天"); // 获取日的两种方式 int thisDay = today.getDayOfMonth(); int thisDayAnother = today.get(ChronoField.DAY_OF_MONTH); System.out.println("今天是这个月的第" + thisDay + "天"); System.out.println("今天是这个月的第" + thisDayAnother + "天"); // 获取星期 DayOfWeek thisDayOfWeek = today.getDayOfWeek(); System.out.println(thisDayOfWeek.toString()); // 今天是这周的第几天 int dayOfWeek = today.get(ChronoField.DAY_OF_WEEK); System.out.println("今天是这周的第" + dayOfWeek + "天"); // 是否为闰年 boolean leapYear = today.isLeapYear(); System.out.println("今年是闰年:" + leapYear); //构造指定的年月日 LocalDate anotherDay = LocalDate.of(2008, 8, 8); System.out.println("指定年月日:" + anotherDay); } 2.2 LocalTimeLocalTime只会获取时间,不获取日期。LocalTime和LocalDate类似,区别在于LocalDate不包含具体时间,而LocalTime不包含具体日期。
public static void localTime() { // 获取当前时间 LocalTime nowTime = LocalTime.now(); System.out.println("当前时间:" + nowTime); //获取小时的两种方式 int hour = nowTime.getHour(); int thisHour = nowTime.get(ChronoField.HOUR_OF_DAY); System.out.println("当前时:" + hour); System.out.println("当前时:" + thisHour); //获取分的两种方式 int minute = nowTime.getMinute(); int thisMinute = nowTime.get(ChronoField.MINUTE_OF_HOUR); System.out.println("当前分:" + minute); System.out.println("当前分:" + thisMinute); //获取秒的两种方式 int second = nowTime.getSecond(); int thisSecond = nowTime.get(ChronoField.SECOND_OF_MINUTE); System.out.println("当前秒:" + second); System.out.println("当前秒:" + thisSecond); // 构造指定时间(最多可到纳秒) LocalTime anotherTime = LocalTime.of(20, 8, 8); System.out.println("构造指定时间:" + anotherTime); } 2.3 LocalDateTimeLocalDateTime表示日期和时间组合。可以通过of()方法直接创建,也可以调用LocalDate的atTime()方法或LocalTime的atDate()方法将LocalDate或LocalTime合并成一个LocalDateTime。
public static void localDateTime() { // 当前日期和时间 LocalDateTime today = LocalDateTime.now(); System.out.println("现在是:" + today); // 创建指定日期和时间 LocalDateTime anotherDay = LocalDateTime.of(2008, Month.AUGUST, 8, 8, 8, 8); System.out.println("创建的指定时间是:" + anotherDay); // 拼接日期和时间 // 使用当前日期,指定时间生成的 LocalDateTime LocalDateTime thisTime = LocalTime.now().atDate(LocalDate.of(2008, 8, 8)); System.out.println("拼接的日期是:" + thisTime); // 使用当前日期,指定时间生成的 LocalDateTime LocalDateTime thisDay = LocalDate.now().atTime(LocalTime.of(12, 24, 12)); System.out.println("拼接的日期是:" + thisDay); // 指定日期和时间生成 LocalDateTime LocalDateTime thisDayAndTime = LocalDateTime.of(LocalDate.of(2008, 8, 8), LocalTime.of(12, 24, 12)); System.out.println("拼接的日期是:" + thisDayAndTime); // 获取LocalDate LocalDate todayDate = today.toLocalDate(); System.out.println("今天日期是:" + todayDate); // 获取LocalTime LocalTime todayTime = today.toLocalTime(); System.out.println("现在时间是:" + todayTime); } 2.4 Instant