Java 获得时区,获得UTC时间

朴灿烈づ我的快乐病毒、 2022-05-15 19:58 560阅读 0赞

Java 获得时区相关的类,主要是ZoneId,还有TimeZone(这个信息详细一点)

ZoneId 主要是通过列表选定了一些规定位置,然后通过这些位置代表的时区,来划分时区,例如 中国就是Asia/Shanghai

然后根据时区,我们可以根据 ZoneId ,来创建TimeZone 对象,再有 TimeZone 对象 来创建Calendar 对象

测试代码如下:

  1. package test.time;
  2. import java.time.ZoneId;
  3. import java.util.Calendar;
  4. import java.util.TimeZone;
  5. /**
  6. * 测试java 时区相关
  7. * @author 12198
  8. *
  9. */
  10. @SuppressWarnings({ "static-access", "unused" })
  11. public class TestZoneId {
  12. public static void main(String[] args) {
  13. System.out.println(TimeZone.getDefault());
  14. for (String string : ZoneId.SHORT_IDS.keySet()) {
  15. String id = ZoneId.SHORT_IDS.get(string);
  16. ZoneId zoneId = ZoneId.of(id);
  17. testSetZone(zoneId);
  18. // printMessage(zoneId);
  19. }
  20. // testCalendar();
  21. }
  22. /**
  23. * 打印一些基本信息
  24. */
  25. /*private static void printMessage(ZoneId zoneId) {
  26. // ZoneId zoneId = ZoneId.systemDefault();
  27. TimeZone timeZone = TimeZone.getTimeZone(zoneId);
  28. System.out.println(timeZone);
  29. System.out.println(zoneId);
  30. Set<String> availableZoneIds = zoneId.getAvailableZoneIds();
  31. ZoneRules rules = zoneId.getRules();//standardOffsets [+08:05:43, +08:00]
  32. ZoneOffset standardOffset = rules.getStandardOffset(Instant.now());//获得标准偏移量
  33. System.out.println(standardOffset);//+08:00 totalSecond 28800 秒 28800000 毫秒
  34. System.out.println(rules);
  35. }*/
  36. /**
  37. * 指定时区或设置默认时区
  38. */
  39. public static void testSetZone(ZoneId zoneId){
  40. // ZoneId zoneId = ZoneId.of(ZoneId.SHORT_IDS.get("ECT"));
  41. // TimeZone timeZone = TimeZone.getDefault();
  42. TimeZone timeZone2 = TimeZone.getTimeZone(zoneId);
  43. System.out.println("zoneId:"+zoneId);
  44. // System.out.println(timeZone);
  45. System.out.println("timeZone2:"+timeZone2);
  46. Calendar calendar = Calendar.getInstance(timeZone2);
  47. System.out.println("zone_offset:" + calendar.get(Calendar.ZONE_OFFSET));
  48. System.out.println("dst_offset:" + calendar.get(Calendar.DST_OFFSET));
  49. }
  50. }

把java 8中定义的 ZoneId.SHORT_IDS 集合拿出来遍历,可以发现时区偏移量 ZONE_OFFSET 在东半球为正数,在西半球为负数,dst_offset 夏时令偏移量 ,大部分时候为0,由于可以根据时区偏移量和夏时令偏移量来进行本地时间和UTC 时间的转换

转换方法如下:

  1. package test.time;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6. public class getUTCTime {
  7. /**
  8. * 获得世界协调时的近似值
  9. * @return Date
  10. */
  11. public static Date getUTCTime(){
  12. Calendar cal = Calendar.getInstance();
  13. //获得时区和 GMT-0 的时间差,偏移量
  14. int offset = cal.get(Calendar.ZONE_OFFSET);
  15. //获得夏令时 时差
  16. int dstoff = cal.get(Calendar.DST_OFFSET);
  17. cal.add(Calendar.MILLISECOND, - (offset + dstoff));
  18. return cal.getTime();
  19. }
  20. /**
  21. * 获得世界协调时的近似值
  22. * @param format 格式化的时间格式
  23. * @return String
  24. */
  25. public static String getUTCTime(String format){
  26. String formatDate = format(getUTCTime(), format);
  27. return formatDate;
  28. }
  29. /**
  30. * 根据传入得本地时间获得 获得 这个对应得UTC 时间
  31. * @param localDate
  32. * @param format
  33. * @return
  34. */
  35. public static String getUTCTimeByLocalTime(String localDate,String format){
  36. Calendar cal = Calendar.getInstance();
  37. //获得时区和 GMT-0 的时间差,偏移量
  38. int offset = cal.get(Calendar.ZONE_OFFSET);
  39. //获得夏令时 时差
  40. int dstoff = cal.get(Calendar.DST_OFFSET);
  41. Date date = new Date(getMillSecond(format, localDate) - (offset + dstoff));//获得当前是UTC时区的时间毫秒值
  42. String formatDate = format(date, format);
  43. return formatDate;
  44. }
  45. /**
  46. * 根据utc时间的字符串形式,获得当前时区的本地时间
  47. * @param utcTime 时间字符串形式
  48. * @param format 时间格式为:yyyyMMddHHmmssS 精确到毫秒值
  49. * @return
  50. */
  51. public static Date getLocalZoneTime(String utcTime,String format){
  52. Calendar cal = Calendar.getInstance();
  53. //获得时区和 GMT-0 的时间差,偏移量
  54. int offset = cal.get(Calendar.ZONE_OFFSET);
  55. //获得夏令时 时差
  56. int dstoff = cal.get(Calendar.DST_OFFSET);
  57. //cal.add(getMillSecond(format, utcTime),+(offset + dstoff));
  58. Date date = new Date(getMillSecond(format, utcTime) + (offset + dstoff));//获得当前是时区的时间毫秒值
  59. return date;
  60. }
  61. /**
  62. * 根据utc时间的字符串形式,获得当前时区的本地时间
  63. * @param utcTime 时间字符串形式
  64. * @param format 时间格式为:yyyyMMddHHmmssS 精确到毫秒值
  65. * @return
  66. */
  67. public static String getLocalZoneTimeString(String utcTime,String format){
  68. return format(getLocalZoneTime(utcTime, format),format);
  69. }
  70. /**
  71. * 根据时间的字符串形式获得时间的毫秒值
  72. * @param format 最好为yyyyMMddHHmmssS 精确到毫秒值,这样转换没有精度损失
  73. * @return
  74. */
  75. public static long getMillSecond(String format,String time){
  76. Date parse = parse(time, format);
  77. return parse.getTime();
  78. }
  79. /**
  80. * 使用用户格式格式化日期
  81. * @param date 日期
  82. * @param pattern 日期格式
  83. * @return
  84. */
  85. public static String format(Date date, String pattern) {
  86. String returnValue = "";
  87. if (date != null) {
  88. SimpleDateFormat df = new SimpleDateFormat(pattern);
  89. returnValue = df.format(date);
  90. }
  91. return (returnValue);
  92. }
  93. /**
  94. * 使用用户格式提取字符串日期
  95. * @param strDate 日期字符串
  96. * @param pattern 日期格式
  97. * @return
  98. */
  99. public static Date parse(String strDate, String pattern) {
  100. SimpleDateFormat df = new SimpleDateFormat(pattern);
  101. try {
  102. return df.parse(strDate);
  103. } catch (ParseException e) {
  104. e.printStackTrace();
  105. return null;
  106. }
  107. }
  108. }

发表评论

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

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

相关阅读