【Java 8系列】Java日期时间的新主宰者:LocalDate、LocalTime、LocalDateTime、ZonedDateTime

迷南。 2022-12-30 07:42 318阅读 0赞

热门系列:

  • 【Java 8系列】收集器Collector与工具类Collectors

  • 【Java 8系列】Stream详解,看这一篇就够啦

  • 【Java 8系列】Lambda 表达式,一看就废

  • 【Java 8系列】Java开发者的判空利器 – Optional

  • 程序人生,精彩抢先看


目录

1、前言

2、正文

2.1 LocalDate、LocalTime、LocalDateTime

2.1.1 获取当前时间

2.1.2 获取当前时间毫秒数/时间戳

2.1.3 获取年、月、日与星期几

2.1.4 设置自定义时间

2.1.5 日期/时间替换成指定的日期/时间

2.1.6 日期时间与字符串相互转换

2.1.7 Date与LocalDateTime相互转换

2.1.8 获取偏移日期时间

2.2 ZonedDateTime

2.3 ZoneId

2.4 Instant

2.5 时间工具类

3、总结


1、前言

本系列一直在分享Java8的新增特性与API,今天和大家一起扒一扒Java的新时间类库:java.time;

之前我在往期博文:【Java编程系列】Java判断世界各时区的夏令时、冬令时 中就有提到过,为什么现在不适用Date时间类,而改用java.time库中的时间类。答案很简单:就是多线程安全性问题!


2、正文

本文主要分享和举例一些常用的类,下面正式开整!!本篇的时间类,都是使用的ISO-8601日历系统时间

ISO-8601日历系统是当今世界上大多数地方使用的现代民用日历系统。它等效于多用的格里高利历系统,该系统在今天一直适用today年的规则。对于当今编写的大多数应用程序,ISO-8601规则完全适用。但是,任何利用历史日期并要求它们准确的应用程序都将发现ISO-8601方法不合适。

2.1 LocalDate、LocalTime、LocalDateTime

注:以上3个类,在使用和功能上基本一样,只是所代表的对象不同,所以放在一起讲解!

  • LocalDate:是一个不可变的日期时间对象,代表一个日期,通常被视为年-月-日;此类是不可变的并且是线程安全的。
  • LocalTime:是一个不可变的日期时间对象,代表一个时间,通常被视为时分秒。时间以纳秒精度表示;此类是不可变的并且是线程安全的。
  • LocalDateTime:是一个不变的日期时间对象,代表一个日期时间,通常被视为年-月-日-时-分-秒。也可以访问其他日期和时间字段,例如,一年中的某天,一周中的某天和一周中的某周。时间以纳秒精度表示;此类是不可变的并且是线程安全的。

下面来看看常用的一些方法,三者取其一,咱们以LocalDateTime为例展开(举栗子一目了然,所以下面尽可能以代码形式讲解):

2.1.1 获取当前时间

  1. public static void main(String[] args) {
  2. //获取当前时间
  3. LocalDateTime localDateTime = LocalDateTime.now();
  4. System.out.println("本地当前日期时间:"+localDateTime);
  5. System.out.println();
  6. //设置时区为美国纽约
  7. System.out.println("美国当前日期时间:"+LocalDateTime.now(ZoneId.of("America/New_York")));
  8. System.out.println();
  9. }

输出:

  1. 本地当前日期时间:2020-12-28T15:25:20.707
  2. 美国当前日期时间:2020-12-28T02:25:20.708

2.1.2 获取当前时间毫秒数/时间戳

  1. public static void main(String[] args) {
  2. //获取当前时间
  3. LocalDateTime localDateTime = LocalDateTime.now();
  4. System.out.println("本地当前日期时间:"+localDateTime);
  5. long millisecond = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  6. System.out.println("获取时间戳:"+millisecond/1000);
  7. System.out.println("获取毫秒数:"+millisecond);
  8. System.out.println();
  9. }

输出:

  1. 本地当前日期时间:2020-12-28T16:43:32.971
  2. 获取时间戳:1609145012
  3. 获取毫秒数:1609145012971

2.1.3 获取年、月、日与星期几

  1. public static void main(String[] args) {
  2. //获取当前时间
  3. LocalDateTime localDateTime = LocalDateTime.now();
  4. System.out.println("本地当前日期时间:"+localDateTime);
  5. //获取年、月、日、星期几
  6. int year = localDateTime.getYear();
  7. System.out.println("获取年份(第一种方式):"+year);
  8. year = localDateTime.get(ChronoField.YEAR);
  9. System.out.println("获取年份(第二种方式):"+year);
  10. System.out.println();
  11. int month = localDateTime.getMonthValue();
  12. System.out.println("获取月份(第一种方式):"+month);
  13. month = localDateTime.getMonth().getValue();
  14. System.out.println("获取月份(第二种方式):"+month);
  15. month = localDateTime.get(ChronoField.MONTH_OF_YEAR);
  16. System.out.println("获取月份(第三种方式):"+month);
  17. System.out.println();
  18. int dayOfWeek = localDateTime.getDayOfWeek().getValue();
  19. System.out.println("获取星期几(第一种方式):"+dayOfWeek);
  20. dayOfWeek = localDateTime.get(ChronoField.DAY_OF_WEEK);
  21. System.out.println("获取星期几(第二种方式):"+dayOfWeek);
  22. System.out.println();
  23. int dayOfMonth = localDateTime.getDayOfMonth();
  24. System.out.println("获取本月当日(第一种方式):"+dayOfMonth);
  25. dayOfMonth = localDateTime.get(ChronoField.DAY_OF_MONTH);
  26. System.out.println("获取本月当日(第二种方式):"+dayOfMonth);
  27. System.out.println();
  28. int dayOfYear = localDateTime.getDayOfYear();
  29. System.out.println("获取本年当日(第一种方式):"+dayOfYear);
  30. dayOfYear = localDateTime.get(ChronoField.DAY_OF_YEAR);
  31. System.out.println("获取本年当日(第二种方式):"+dayOfYear);
  32. }

输出:

  1. 本地当前日期时间:2020-12-29T10:32:49.698
  2. 获取年份(第一种方式):2020
  3. 获取年份(第二种方式):2020
  4. 获取月份(第一种方式):12
  5. 获取月份(第二种方式):12
  6. 获取月份(第三种方式):12
  7. 获取星期几(第一种方式):2
  8. 获取星期几(第二种方式):2
  9. 获取本月当日(第一种方式):29
  10. 获取本月当日(第二种方式):29
  11. 获取本年当日(第一种方式):364
  12. 获取本年当日(第二种方式):364

2.1.4 设置自定义时间

  1. public static void main(String[] args) {
  2. //设置自定义时间
  3. LocalDateTime tempTime = LocalDateTime.of(2020,11,28,15,00,01);
  4. System.out.println("自定义设置的日期时间:"+tempTime);
  5. System.out.println();
  6. //设置自定义日期
  7. LocalDate tempDate = LocalDate.of(2019,10,1);
  8. System.out.println("自定义设置的日期:"+tempDate);
  9. System.out.println();
  10. }

输出:

  1. 自定义设置的日期时间:2020-11-28T15:00:01
  2. 自定义设置的日期:2019-10-01

2.1.5 日期/时间替换成指定的日期/时间

这里会用到一个方法,adjustInto():将指定的时间对象调整为具有与此对象相同的日期和时间

  1. public static void main(String[] args) {
  2. //获取当前时间
  3. LocalDateTime localDateTime = LocalDateTime.now();
  4. System.out.println("本地当前日期时间:"+localDateTime);
  5. System.out.println();
  6. //设置自定义时间
  7. LocalDateTime tempTime = LocalDateTime.of(2020,11,28,15,00,01);
  8. System.out.println("自定义设置的日期时间:"+tempTime);
  9. System.out.println();
  10. // //设置自定义日期
  11. LocalDate tempDate = LocalDate.of(2019,10,1);
  12. System.out.println("自定义设置的日期:"+tempDate);
  13. System.out.println();
  14. //通过adjustInto方法实现日期转换
  15. //将指定的时间对象调整为具有与此对象相同的日期和时间
  16. localDateTime = (LocalDateTime)tempDate.adjustInto(localDateTime);
  17. tempTime = (LocalDateTime)tempDate.adjustInto(tempTime);
  18. System.out.println("转换后的localDateTime:"+localDateTime);
  19. System.out.println("转换后的tempTime:"+tempTime);
  20. System.out.println();
  21. }

输出:

  1. 本地当前日期时间:2020-12-28T15:30:20.609
  2. 自定义设置的日期时间:2020-11-28T15:00:01
  3. 自定义设置的日期:2019-10-01
  4. 转换后的localDateTime2019-10-01T15:30:20.609
  5. 转换后的tempTime2019-10-01T15:00:01

2.1.6 日期时间与字符串相互转换

  1. private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
  2. private static final String YYYYMMDD_HH_MM_SS = "yyyy/MM/dd HH:mm:ss";
  3. public static void main(String[] args) {
  4. //获取当前时间
  5. LocalDateTime localDateTime = LocalDateTime.now();
  6. System.out.println("本地当前日期时间:"+localDateTime);
  7. //日期与字符串相互转换
  8. //日期转字符串
  9. String dateTimeStr = localDateTime.format(DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS));
  10. System.out.println("日期时间格式化成字符串后:"+dateTimeStr);
  11. //字符串转日期
  12. String convertTime = "2020/12/12 12:12:12";
  13. LocalDateTime convertLocalDateTime = LocalDateTime.parse(convertTime,DateTimeFormatter.ofPattern(YYYYMMDD_HH_MM_SS));
  14. System.out.println("由字符串转换成的日期时间为:"+convertLocalDateTime);
  15. }

输出:

  1. 本地当前日期时间:2020-12-29T10:43:45.295
  2. 日期时间格式化成字符串后:2020-12-29 10:43:45
  3. 由字符串转换成的日期时间为:2020-12-12T12:12:12

2.1.7 Date与LocalDateTime相互转换

  1. private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
  2. private static final String YYYYMMDD_HH_MM_SS = "yyyy/MM/dd HH:mm:ss";
  3. public static void main(String[] args) {
  4. //获取当前时间
  5. LocalDateTime localDateTime = LocalDateTime.now();
  6. System.out.println("本地当前日期时间:"+localDateTime);
  7. //Date转换成LocalDateTime
  8. Date date = new Date();
  9. LocalDateTime date2LocalDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
  10. System.out.println("Date转换成LocalDateTime后>>>>"+date2LocalDateTime);
  11. //LocalDateTime转换成Date
  12. Date localDateTime2Date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  13. System.out.println("LocalDateTime转换成Date后>>>>"+localDateTime2Date);
  14. System.out.println("格式化一下>>>>"+FastDateFormat.getInstance(YYYY_MM_DD_HH_MM_SS).format(localDateTime2Date));
  15. }

输出:

  1. 本地当前日期时间:2020-12-29T11:02:16.883
  2. Date转换成LocalDateTime后>>>>2020-12-29T11:02:16.884
  3. LocalDateTime转换成Date后>>>>Tue Dec 29 11:02:16 CST 2020
  4. 格式化一下>>>>2020-12-29 11:02:16

2.1.8 获取偏移日期时间

此处需要提一下,会常用的两个类似功能的方法:minus()plus()**,**其中还有一些类似的指定方法,如:






















































LocalDateTime minus​(long amountToSubtract, TemporalUnit unit)

返回此日期时间的副本,减去指定的数量。
LocalDateTime minus​(TemporalAmount amountToSubtract)

返回此日期时间的副本,减去指定的数量。
LocalDateTime minusDays​(long days)

返回此副本的副本,LocalDateTime其中减去指定的天数。
LocalDateTime minusHours​(long hours)

返回此副本的副本,LocalDateTime其中减去指定的小时数。
LocalDateTime minusMinutes​(long minutes)

返回此副本的副本,LocalDateTime其中减去指定的分钟数。
LocalDateTime minusMonths​(long months)

返回此副本的副本,LocalDateTime其中减去指定的月数。
LocalDateTime minusNanos​(long nanos)

返回此副本的副本,LocalDateTime其中减去指定的纳秒数。
LocalDateTime minusSeconds​(long seconds)

返回此副本的副本,LocalDateTime其中减去指定的秒数。
LocalDateTime minusWeeks​(long weeks)

返回此副本的副本,LocalDateTime其中减去指定的周数。
LocalDateTime minusYears​(long years)

返回此副本的副本,LocalDateTime其中减去指定的年数。





















































LocalDateTime plus​(long amountToAdd, TemporalUnit unit)

返回此日期时间的副本,其中添加了指定的数量。
LocalDateTime plus​(TemporalAmount amountToAdd)

返回此日期时间的副本,其中添加了指定的数量。
LocalDateTime plusDays​(long days)

返回LocalDateTime带有指定天数的副本。
LocalDateTime plusHours​(long hours)

返回LocalDateTime带有指定小时数的副本。
LocalDateTime plusMinutes​(long minutes)

返回LocalDateTime带有指定分钟数的副本。
LocalDateTime plusMonths​(long months)

返回LocalDateTime带有指定月份数的副本。
LocalDateTime plusNanos​(long nanos)

返回此副本的副本,LocalDateTime其中添加了指定的纳秒数。
LocalDateTime plusSeconds​(long seconds)

返回此副本的副本,LocalDateTime其中添加了指定的秒数。
LocalDateTime plusWeeks​(long weeks)

返回此副本的副本,LocalDateTime其中添加了指定的周数。
LocalDateTime plusYears​(long years)

返回LocalDateTime带有指定年限的副本。

下面列举几个常用栗子:

  1. public static void main(String[] args) {
  2. //获取当前时间
  3. LocalDateTime localDateTime = LocalDateTime.now(ZoneId.systemDefault());
  4. System.out.println("本地当前日期时间:"+localDateTime);
  5. //获取偏移时间
  6. //偏移天(正数:往后偏移;负数:往过去时间偏移)
  7. System.out.println("明日此时:"+localDateTime.plusDays(1));
  8. System.out.println("明日此时1:"+localDateTime.minusDays(-1));
  9. System.out.println("前天此时:"+localDateTime.plusDays(-2));
  10. //偏移时
  11. System.out.println("当前时间后2个小时:"+localDateTime.plusHours(2));
  12. System.out.println("当前时间前5个小时:"+localDateTime.plusHours(-5));
  13. //偏移年
  14. System.out.println("去年此时:"+localDateTime.plusYears(-1));
  15. //偏移月
  16. System.out.println("下月此时:"+localDateTime.plusMonths(1));
  17. //偏移周
  18. System.out.println("上周此时:"+localDateTime.plusWeeks(-1));
  19. }

输出:

  1. 本地当前日期时间:2020-12-29T11:22:24.914
  2. 明日此时:2020-12-30T11:22:24.914
  3. 明日此时12020-12-30T11:22:24.914
  4. 前天此时:2020-12-27T11:22:24.914
  5. 当前时间后2个小时:2020-12-29T13:22:24.914
  6. 当前时间前5个小时:2020-12-29T06:22:24.914
  7. 去年此时:2019-12-29T11:22:24.914
  8. 下月此时:2021-01-29T11:22:24.914
  9. 上周此时:2020-12-22T11:22:24.914

2.2 ZonedDateTime

ZonedDateTime其实就是含有时区的LocalDateTime,其实就是LocalDateTime+ZoneId,其对照关系可以如图:

20201229164342942.png

所以,其对应的功能基本与上述一致,因此不再赘述!


2.3 ZoneId

ZoneId是时区ID类,主要包含了各时区信息!一般对时区没有要求的情况,我们会使用:

  1. ZoneId.systemDefault()

来设置默认时区!

通过源代码查看,目前常用的时区映射关系有如下这些:

  1. public static final Map<String, String> SHORT_IDS;
  2. /**
  3. * 当前为ZoneId源码,除了
  4. * 以下中文注释为作者个人翻译而来,非源码注释
  5. **/
  6. static {
  7. Map<String, String> map = new HashMap<>(64);
  8. //"Australia/Darwin","澳洲/达尔文"
  9. map.put("ACT", "Australia/Darwin");
  10. //"Australia/Sydney","澳洲/悉尼"
  11. map.put("AET", "Australia/Sydney");
  12. //"America/Argentina/Buenos_Aires","美洲/阿根廷/布宜诺斯艾利斯"
  13. map.put("AGT", "America/Argentina/Buenos_Aires");
  14. //"Africa/Cairo","非洲/开罗"
  15. map.put("ART", "Africa/Cairo");
  16. //"America/Anchorage","美洲/安克雷奇"
  17. map.put("AST", "America/Anchorage");
  18. //"America/Sao_Paulo","美洲/圣保罗"
  19. map.put("BET", "America/Sao_Paulo");
  20. //"Asia/Dhaka","亚洲/达卡"
  21. map.put("BST", "Asia/Dhaka");
  22. //"Africa/Harare","非洲/哈拉雷"
  23. map.put("CAT", "Africa/Harare");
  24. //"America/St_Johns","美洲/圣约翰"
  25. map.put("CNT", "America/St_Johns");
  26. //"America/Chicago","美洲/芝加哥"
  27. map.put("CST", "America/Chicago");
  28. //"Asia/Shanghai","亚洲/上海"
  29. map.put("CTT", "Asia/Shanghai");
  30. //"Africa/Addis_Ababa","非洲/亚的斯亚贝巴"
  31. map.put("EAT", "Africa/Addis_Ababa");
  32. //"Europe/Paris","欧洲/巴黎"
  33. map.put("ECT", "Europe/Paris");
  34. //"America/Indiana/Indianapolis","美洲/印第安纳州/印第安纳波利斯"
  35. map.put("IET", "America/Indiana/Indianapolis");
  36. //"Asia/Kolkata","亚洲/加尔各答"
  37. map.put("IST", "Asia/Kolkata");
  38. //"Asia/Tokyo","亚洲/东京"
  39. map.put("JST", "Asia/Tokyo");
  40. //"Pacific/Apia","太平洋/阿皮亚"
  41. map.put("MIT", "Pacific/Apia");
  42. //"Asia/Yerevan","亚洲/埃里温"
  43. map.put("NET", "Asia/Yerevan");
  44. //"Pacific/Auckland","太平洋/奥克兰"
  45. map.put("NST", "Pacific/Auckland");
  46. //"Asia/Karachi","亚洲/卡拉奇"
  47. map.put("PLT", "Asia/Karachi");
  48. //"America/Phoenix","美洲/凤凰城"
  49. map.put("PNT", "America/Phoenix");
  50. //"America/Puerto_Rico","美洲/波多黎各"
  51. map.put("PRT", "America/Puerto_Rico");
  52. //"America/Los_Angeles","美洲/洛杉矶"
  53. map.put("PST", "America/Los_Angeles");
  54. //"Pacific/Guadalcanal","太平洋/瓜达尔卡纳尔岛"
  55. map.put("SST", "Pacific/Guadalcanal");
  56. //"Asia/Ho_Chi_Minh","亚洲/胡志明市"
  57. map.put("VST", "Asia/Ho_Chi_Minh");
  58. //"-05:00","东部标准时间"(纽约、华盛顿)
  59. map.put("EST", "-05:00");
  60. //"-07:00","山地标准时间"
  61. map.put("MST", "-07:00");
  62. //"-10:00","夏威夷-阿留申标准时区"
  63. map.put("HST", "-10:00");
  64. SHORT_IDS = Collections.unmodifiableMap(map);
  65. }

举个栗子:

  1. System.out.println("美国纽约当前日期时间:"+LocalDateTime.now(ZoneId.of("America/New_York")));
  2. //输出:
  3. 美国纽约当前日期时间:2020-12-29T04:10:53.257

2.4 Instant

Instant类,是包含时间线上的某一个瞬时点。

举个栗子:

  1. public static void main(String[] args) {
  2. //获取当前时间
  3. LocalDateTime localDateTime = LocalDateTime.now(ZoneId.systemDefault());
  4. System.out.println("本地当前日期时间戳:"+localDateTime.atZone(ZoneId.systemDefault()).toEpochSecond());
  5. System.out.println();
  6. Instant instant = Instant.from(localDateTime.atZone(ZoneId.systemDefault()).plusHours(-1));
  7. System.out.println("前一小时此时的时间戳:"+instant.getEpochSecond());
  8. System.out.println("前一小时此时的毫秒数:"+instant.toEpochMilli());
  9. }

输出:

  1. 本地当前日期时间戳:1609235707
  2. //刚好相差3600秒
  3. 前一小时此时的时间戳:1609232107
  4. 前一小时此时的毫秒数:1609232107078

2.5 时间工具类

  1. /**
  2. * Date工具类
  3. * @author Yangy
  4. */
  5. public class DateUtils {
  6. private static final ZoneId ZONE_ID = ZoneId.systemDefault();
  7. /**
  8. * LocalDateTime转化为Date
  9. *
  10. * @param localDateTime
  11. * @return
  12. */
  13. public static Date toDate(LocalDateTime localDateTime) {
  14. return Date.from(localDateTime.atZone(ZONE_ID).toInstant());
  15. }
  16. /**
  17. * LocalDateTime转化为Date
  18. *
  19. * @param localDateTime
  20. * @return
  21. */
  22. public static Date toDate(LocalDate localDate) {
  23. return Date.from(localDate.atStartOfDay(ZONE_ID).toInstant());
  24. }
  25. /**
  26. * Date转化为LocalDateTime
  27. *
  28. * @param date
  29. * @return
  30. */
  31. public static LocalDateTime toLocalDateTime(Date date) {
  32. return LocalDateTime.ofInstant(date.toInstant(), ZONE_ID);
  33. }
  34. /**
  35. * LocalDate转化为LocalDateTime
  36. *
  37. * @param localDate
  38. * @return
  39. */
  40. public static LocalDateTime toLocalDateTime(LocalDate localDate) {
  41. return LocalDateTime.of(localDate, LocalTime.MIN);
  42. }
  43. /**
  44. * Date转化为LocalDate
  45. *
  46. * @param date
  47. * @return
  48. */
  49. public static LocalDate toLocalDate(Date date) {
  50. return date.toInstant().atZone(ZONE_ID).toLocalDate();
  51. }
  52. /**
  53. * Date转化为字符串
  54. *
  55. * @param date
  56. * @param formatter
  57. * @return
  58. */
  59. public static String format(Date date, DateFormatter formatter) {
  60. LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZONE_ID);
  61. return formatter.getDateTimeFormatter().format(localDateTime);
  62. }
  63. /**
  64. * 字符串转化为Date
  65. *
  66. * @param text
  67. * @param formatter
  68. * @return
  69. */
  70. public static Date parse(String text, DateFormatter formatter) {
  71. return formatter.parse(text);
  72. }
  73. public static enum DateFormatter {
  74. /**
  75. * 格式yyyy
  76. *
  77. */
  78. YEAR_FORMATTER(DateTimeFormatter.ofPattern("yyyy", Locale.CHINA)) {
  79. @Override
  80. public Date parse(String text) {
  81. Year year = Year.parse(text, dateTimeFormatter);
  82. return Date.from(year.atDay(1).atStartOfDay(ZONE_ID).toInstant());
  83. }
  84. },
  85. /**
  86. *
  87. * 格式yyyy-MM
  88. *
  89. */
  90. YEAR_MONTH_FORMATTER(DateTimeFormatter.ofPattern("yyyy-MM", Locale.CHINA)) {
  91. @Override
  92. public Date parse(String text) {
  93. YearMonth yearMonth = YearMonth.parse(text, dateTimeFormatter);
  94. return Date.from(yearMonth.atDay(1).atStartOfDay(ZONE_ID).toInstant());
  95. }
  96. },
  97. /**
  98. *
  99. * 格式yyyy-MM-dd
  100. *
  101. * @author Val Song Dec 17, 2017 7:26:25 PM
  102. *
  103. */
  104. DATE_FORMATTER(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.CHINA)) {
  105. @Override
  106. public Date parse(String text) {
  107. LocalDate localDate = LocalDate.parse(text, dateTimeFormatter);
  108. return Date.from(localDate.atStartOfDay(ZONE_ID).toInstant());
  109. }
  110. },
  111. /**
  112. * 格式yyyy-MM-dd HH:mm:ss
  113. *
  114. */
  115. DATE_TIME_FORMATTER(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA)) {
  116. @Override
  117. public Date parse(String text) {
  118. LocalDateTime localDateTime = LocalDateTime.parse(text, dateTimeFormatter);
  119. return Date.from(localDateTime.atZone(ZONE_ID).toInstant());
  120. }
  121. },
  122. /**
  123. * 格式yyyyMMdd_HHmmss
  124. *
  125. */
  126. YYYYMMDD_HHMMSS_FORMATTER(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss", Locale.CHINA)) {
  127. @Override
  128. public Date parse(String text) {
  129. LocalDateTime localDateTime = LocalDateTime.parse(text, dateTimeFormatter);
  130. return Date.from(localDateTime.atZone(ZONE_ID).toInstant());
  131. }
  132. };
  133. protected DateTimeFormatter dateTimeFormatter;
  134. private DateFormatter(DateTimeFormatter dateTimeFormatter) {
  135. this.dateTimeFormatter = dateTimeFormatter;
  136. }
  137. public DateTimeFormatter getDateTimeFormatter() {
  138. return dateTimeFormatter;
  139. }
  140. public abstract Date parse(String text);
  141. }
  142. }

3、总结

1.切记,LocalDate、LocalTime、LocalDateTime这几个类,都是没有设置时区的日期时间类,所以,对时区有要求的时候,必须手动设置指定时区;否则,采用默认时区即可

2.除了国内,世界其他很多地区都有夏冬令时的区分!所以,业务针对时区和夏冬令时有区别的,需要注意这一点!

最后,希望此文如果对你有帮助的话,请点赞、留言、关注我吧!

扫描左侧二维码,即可查看作者公众号内的更多精彩内容,先感谢各位朋友的支持啦!!!

发表评论

表情:
评论列表 (有 0 条评论,318人围观)

还没有评论,来说两句吧...

相关阅读