为什么需要LocalDate、LocalTime、LocalDateTime

这个问题等同于java8之前的Date类(java.util.Date)有什么不足。

  1. Date类从JDK1.0开始就存在了,但因为它历史悠久,所以它的大部分构造器、方法都已经过时了,不再推荐使用了。
  2. Date类只能存储时间,如果涉及到时间的操作需要配合SimpleDateFormat使用。
  3. 所有Date类都是可变的,因此它们不是线程安全的。这是Java Date和Calendar类的最大问题之一。

localDate

LocalDate不包含时间,只是单纯的年月日

  1. package example;
  2. import java.time.DayOfWeek;
  3. import java.time.LocalDate;
  4. import java.time.LocalDateTime;
  5. import java.time.LocalTime;
  6. import java.time.Month;
  7. import java.time.format.DateTimeFormatter;
  8. import java.time.temporal.TemporalAdjusters;
  9. import java.util.Date;
  10. public class JavaDateTest {
  11. public static void main(String[] args) {
  12. // TODO Auto-generated method stub
  13. java8LocalDateTest();
  14. }
  15. private static void java8LocalDateTest() {
  16. System.out.println("========java8LocalDateTest-Begin========");
  17. // 取当前日期:
  18. LocalDate today = LocalDate.now(); // -> 2020-05-18
  19. // 根据年月日取日期:
  20. LocalDate crischristmas = LocalDate.of(2020, 05, 17); // -> 2020-05-17
  21. // 根据字符串取:
  22. LocalDate endOfFeb = LocalDate.parse("2020-02-29"); // 严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式
  23. // LocalDate.parse("2020-02-30"); // 无效日期无法通过:DateTimeParseException: Invalid date
  24. System.out.println(today);
  25. System.out.println(crischristmas);
  26. System.out.println(endOfFeb);
  27. // 取本月第1天:
  28. LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2020-05-01
  29. // 取本月第2天:
  30. LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2020-05-02
  31. // 取本月最后一天,再也不用计算是28,29,30还是31:
  32. LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2020-05-31
  33. // 取下一天:
  34. LocalDate firstDayOf2020 = lastDayOfThisMonth.plusDays(1); // 变成了2020-06-01
  35. // 取2020年1月第一个周一,用Calendar要死掉很多脑细胞:
  36. LocalDate firstMondayOf2020 = LocalDate.parse("2020-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2020-01-06
  37. System.out.println(firstDayOfThisMonth);
  38. System.out.println(secondDayOfThisMonth);
  39. System.out.println(lastDayOfThisMonth);
  40. System.out.println(firstDayOf2020);
  41. System.out.println(firstMondayOf2020);
  42. // toEpochDay(),从1970-01-01(ISO)开始的天数
  43. System.out.println(today.toEpochDay());
  44. System.out.println("========java8LocalDateTest-End========");
  45. }
  46. }
  47. /*
  48. * ========java8LocalDateTest-Begin========
  49. * 2020-05-18
  50. * 2020-05-17
  51. * 2020-02-29
  52. * 2020-05-01
  53. * 2020-05-02
  54. * 2020-05-31
  55. * 2020-06-01
  56. * 2020-01-06
  57. * 18400
  58. * ========java8LocalDateTest-End========
  59. */

localTime

  1. package example;
  2. import java.time.DayOfWeek;
  3. import java.time.LocalDate;
  4. import java.time.LocalDateTime;
  5. import java.time.LocalTime;
  6. import java.time.Month;
  7. import java.time.format.DateTimeFormatter;
  8. import java.time.temporal.TemporalAdjusters;
  9. import java.util.Date;
  10. public class JavaDateTest {
  11. public static void main(String[] args) {
  12. // TODO Auto-generated method stub
  13. java8LocalTimeTest();
  14. }
  15. private static void java8LocalTimeTest() {
  16. System.out.println("========java8LocalTimeTest-Begin========");
  17. LocalTime now = LocalTime.now(); // 23:11:08.006
  18. LocalTime zero = LocalTime.of(0, 0, 0); // 00:00:00
  19. LocalTime mid = LocalTime.parse("12:00:00"); // 12:00:00
  20. System.out.println("当前时间:" + now);
  21. System.out.println(zero);
  22. System.out.println(mid);
  23. System.out.println("========java8LocalTimeTest-End========");
  24. }
  25. }
  26. /*
  27. * 当前时间:11:03:08.282
  28. * 00:00
  29. * 12:00
  30. * ========java8LocalTimeTest-End========
  31. */

localDateTime

  1. package example;
  2. import java.time.DayOfWeek;
  3. import java.time.LocalDate;
  4. import java.time.LocalDateTime;
  5. import java.time.LocalTime;
  6. import java.time.Month;
  7. import java.time.format.DateTimeFormatter;
  8. import java.time.temporal.TemporalAdjusters;
  9. import java.util.Date;
  10. public class JavaDateTest {
  11. public static void main(String[] args) {
  12. // TODO Auto-generated method stub
  13. java8LocalDateTimeTest();
  14. }
  15. private static void java8LocalDateTimeTest() {
  16. // 获取当前此刻的时间
  17. System.out.println("========java8LocalDateTimeTest-Begin========");
  18. LocalDateTime rightNow = LocalDateTime.now();
  19. System.out.println( "当前时刻:" + rightNow );
  20. System.out.println( "当前年份:" + rightNow.getYear() );
  21. System.out.println( "当前月份:" + rightNow.getMonth() );
  22. System.out.println( "当前日份:" + rightNow.getDayOfMonth() );
  23. System.out.println( "当前时:" + rightNow.getHour() );
  24. System.out.println( "当前分:" + rightNow.getMinute() );
  25. System.out.println( "当前秒:" + rightNow.getSecond() );
  26. // 构造一个指定年、月、日的时间:
  27. LocalDateTime beforeDate = LocalDateTime.of(2020, Month.MAY, 1, 1, 0, 0);
  28. System.out.println("构造的时间:" + beforeDate);
  29. // 修改日期
  30. LocalDateTime afterDateTime = changeDateTime(beforeDate);
  31. System.out.println("修改后的时间:" + afterDateTime);
  32. formatPrintDate(rightNow);
  33. System.out.println("========java8LocalDateTimeTest-End========");
  34. }
  35. private static LocalDateTime changeDateTime(LocalDateTime ldt) {
  36. // 减少两年
  37. ldt = ldt.minusYears(2);
  38. // 增加三个月
  39. ldt = ldt.plusMonths(3);
  40. // 修改年份
  41. ldt = ldt.withYear(2019);
  42. // 修改小时
  43. ldt = ldt.withHour(2);
  44. //减少一天
  45. ldt = ldt.minusDays(1);
  46. return ldt;
  47. }
  48. private static void formatPrintDate(LocalDateTime ldt) {
  49. String result1 = ldt.format( DateTimeFormatter.ISO_DATE );
  50. String result2 = ldt.format( DateTimeFormatter.BASIC_ISO_DATE );
  51. String result3 = ldt.format( DateTimeFormatter.ofPattern("yyyy/MM/dd") );
  52. System.out.println("格式化后的日期(基本样式一举例):" + result1);
  53. System.out.println("格式化后的日期(基本样式二举例):" + result2);
  54. System.out.println("格式化后的日期(自定义样式举例):" + result3);
  55. }
  56. }
  57. /*
  58. * ========java8LocalDateTimeTest-Begin========
  59. * 当前时刻:2020-05-18T11:03:08.282
  60. * 当前年份:2020
  61. * 当前月份:MAY
  62. * 当前日份:18
  63. * 当前时:11
  64. * 当前分:3
  65. * 当前秒:8
  66. * 构造的时间:2020-05-01T01:00
  67. * 修改后的时间:2019-07-31T02:00
  68. * 格式化后的日期(基本样式一举例):2020-05-18
  69. * 格式化后的日期(基本样式二举例):20200518
  70. * 格式化后的日期(自定义样式举例):2020/05/18
  71. * ========java8LocalDateTimeTest-End========
  72. */

JDBC

最新JDBC映射将把数据库的日期类型和Java 8的新类型关联起来:

  1. SQL -> Java
  2. --------------------------
  3. date -> LocalDate
  4. time -> LocalTime
  5. timestamp -> LocalDateTime

面试题

输入某年某月某日,判断这一天是这一年的第几天?

  1. package com.neusoft.test;
  2. import java.time.LocalDate;
  3. import java.util.Scanner;
  4. /*
  5. * 输入某年某月某日,判断这一天是这一年的第几天?
  6. */
  7. public class Unit14 {
  8. public static void main(String[] args) {
  9. int year, month, day;
  10. Scanner s = new Scanner(System.in);
  11. System.out.print("请输入年:");
  12. year = s.nextInt();
  13. System.out.print("请输入月:");
  14. month = s.nextInt();
  15. System.out.print("请输入日:");
  16. day = s.nextInt();
  17. LocalDate date = LocalDate.of(year, month, day);
  18. System.out.println(date.toEpochDay() - LocalDate.of(year, 1, 1).toEpochDay());
  19. }
  20. }