当前位置:   article > 正文

java时间格式转换时时区相关的坑_java带时区时间字符串

java带时区时间字符串

先上结论:
1、yyyy-MM-dd'T'HH:mm:ss.SSSXXX的XXX表示时区,Z零时区,+08:00东八区(大致)
2、java 8,时间字符串不带时区,使用LocalDateTime,因为即使字符串附带了时区信息也不被使用;如果要使用字符串附带的时区信息则使用ZonedDateTime
3、使用DateTimeFormatter,毫秒都是右补零;SimpleDateFormat是左补零;解决方式使用三位毫秒格式,如:2023-02-13T00:00:00.12Z改为2023-02-13T00:00:00.120Z或2023-02-13T00:00:00.012Z再做数据类型转换

看代码和注释

  1. package com.rootcloud;
  2. import org.apache.commons.lang.StringUtils;
  3. import java.text.ParseException;
  4. import java.text.SimpleDateFormat;
  5. import java.time.Instant;
  6. import java.time.LocalDateTime;
  7. import java.time.ZoneId;
  8. import java.time.ZonedDateTime;
  9. import java.time.format.DateTimeFormatter;
  10. import java.util.Date;
  11. public class Main21DateTest {
  12. public static void main(String[] args) throws ParseException {
  13. //结论:java 8,时间字符串不带时区,使用LocalDateTime,因为即使字符串附带了时区信息也不被使用;如果要使用字符串附带的时区信息则使用ZonedDateTime
  14. //使用DateTimeFormatter,毫秒都是右补零;SimpleDateFormat是左补零;解决方式永远使用三位毫秒格式
  15. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); //基准
  16. System.out.println("2023-02-13T00:00:00.120");
  17. System.out.println(sdf.parse("2023-02-13T00:00:00.120").getTime());
  18. System.out.println("DateTimeFormatter+LocalDateTime");
  19. //XXX代表时区
  20. final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
  21. //8SH 输入 东八区时间,选择上海时间所在时区,输出 0时区时间,时间戳和基准时间相同(毫秒自动右补零)
  22. final Instant instant8SH = LocalDateTime.parse("2023-02-13T00:00:00.12+08:00", dateTimeFormatter).atZone(ZoneId.of("Asia/Shanghai")).toInstant();
  23. System.out.println("8SH");
  24. System.out.println(instant8SH.toString());
  25. System.out.println(instant8SH.toEpochMilli());
  26. //8UTC与8SH相比,输入zoneId变成UTC,输出时间为 0时区2023-02-13T00:00:00.120Z,时间戳比8SH小8H,结论UTC会覆盖+08:00的效果
  27. final Instant instant8UTC = LocalDateTime.parse("2023-02-13T00:00:00.12+08:00", dateTimeFormatter).atZone(ZoneId.of("UTC")).toInstant();
  28. System.out.println("8UTC");
  29. System.out.println(instant8UTC.toString());
  30. System.out.println(instant8UTC.toEpochMilli());
  31. //8Default输出和8SH相同,猜测1:覆盖成Asia/Shanghai所在时区,猜测2:不覆盖,使用字符串的时区
  32. final Instant instant8Default = LocalDateTime.parse("2023-02-13T00:00:00.12+08:00", dateTimeFormatter).atZone(ZoneId.systemDefault()).toInstant();
  33. System.out.println("8Default");
  34. System.out.println(instant8Default.toString());
  35. System.out.println(instant8Default.toEpochMilli());
  36. //ZUTC 输入Z和UTC同为零时区,输出与基准差8H 符合预期
  37. final Instant instantZUTC = LocalDateTime.parse("2023-02-13T00:00:00.12Z", dateTimeFormatter).atZone(ZoneId.of("UTC")).toInstant();
  38. System.out.println("ZUTC");
  39. System.out.println(instantZUTC.toString());
  40. System.out.println(instantZUTC.toEpochMilli());
  41. //ZDefault 与 8Default输出相等,default
  42. final Instant instantZDefault = LocalDateTime.parse("2023-02-13T00:00:00.12Z", dateTimeFormatter).atZone(ZoneId.systemDefault()).toInstant();
  43. System.out.println("ZDefault");
  44. System.out.println(instantZDefault.toString());
  45. System.out.println(instantZDefault.toEpochMilli());
  46. //java.time.LocalDateTime.from 里看到有TemporalAccessor有多种实现,其中包括ZonedDateTime,自带时区
  47. final Instant instant = ZonedDateTime.parse("2023-02-13T00:00:00.12Z", dateTimeFormatter).toInstant();
  48. System.out.println("ZonedDateTime");
  49. System.out.println(instant.toString());
  50. System.out.println(instant.toEpochMilli());
  51. // 报错,必须定义XXX
  52. // final DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
  53. // final Instant instant2 = ZonedDateTime.parse("2023-02-13T00:00:00.120", dateTimeFormatter2).toInstant();
  54. // System.out.println("ZonedDateTime");
  55. // System.out.println(instant2.toString());
  56. // System.out.println(instant2.toEpochMilli());
  57. System.out.println("\nSimpleDateFormat+Date");
  58. final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
  59. Date parse = simpleDateFormat.parse("2023-02-13T00:00:00.12Z");
  60. System.out.println(parse.getTime());
  61. parse = simpleDateFormat.parse("2023-02-13T00:00:00.12+08:00");
  62. System.out.println(parse.getTime());
  63. }
  64. }

结果:

  1. 2023-02-13T00:00:00.120
  2. 1676217600120
  3. DateTimeFormatter+LocalDateTime
  4. 8SH
  5. 2023-02-12T16:00:00.120Z
  6. 1676217600120
  7. 8UTC
  8. 2023-02-13T00:00:00.120Z
  9. 1676246400120
  10. 8Default
  11. 2023-02-12T16:00:00.120Z
  12. 1676217600120
  13. ZUTC
  14. 2023-02-13T00:00:00.120Z
  15. 1676246400120
  16. ZDefault
  17. 2023-02-12T16:00:00.120Z
  18. 1676217600120
  19. ZonedDateTime
  20. 2023-02-13T00:00:00.120Z
  21. 1676246400120
  22. ZonedDateTime
  23. 2023-02-13T00:00:00.120Z
  24. 1676246400120
  25. SimpleDateFormat+Date
  26. 1676246400012
  27. 1676217600012

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/572125
推荐阅读
相关标签
  

闽ICP备14008679号