当前位置: 首页 > 编程笔记 >

java时区转换的理解及示例详解

侯英达
2023-03-14
本文向大家介绍java时区转换的理解及示例详解,包括了java时区转换的理解及示例详解的使用技巧和注意事项,需要的朋友参考一下

一、时区的基本概念

GMT(Greenwich Mean Time),即格林威治标准时,是东西经零度的地方。人们将地球人为的分为24等份,每一等份为一个时区,每时区横跨经度15度,时间正好为1小时。往西一个时区,则减去一小时;往东一个时区,则加上一小时。中国在东经120度上,(东经120°-东经0°)所得度数再除以15,即得8。

UTC(Coordinated Universal Time),即世界协调时间,是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。UTC的本质强调的是比GMT更为精确的世界时间标准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。

CST时间却同时可以代表如下 4 个不同的时区:

  1. Central Standard Time (USA) UT-6:00
  2. Central Standard Time (Australia) UT+9:30
  3. China Standard Time UT+8:00
  4. Cuba Standard Time UT-4:00

可见,CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。

DST(Daylight Saving Time),夏日节约时间,指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用,在英国则称为夏令时间(Summer Time)。

PDT以及PST, PDT 是 Pacific Daylight Time 的缩写,美国夏季始于每年4月的第1个周日,止于每年10月的最后一个周日。夏令时比正常时间早一小时,与PDT时间相对应的是PST , Pacific Standard Time 。 夏时制结束后就是PST(太平洋标准时间),西八区,与北京时间(东八区)时差-16个小时。

二、java中的时区

可以用以下code,列出java中的时区

String ids[] = TimeZone.getAvailableIDs();
 for(String id: ids) {
  System.out.println(id);
 }

注意:你会发现在PDT不在该时区列表里
如果要用PDT,用PST作为时区可以得到准确的时间,即使是夏令时

TimeZone timeZone = TimeZone.getTimeZone("PST");
 Calendar calendar = new GregorianCalendar();
 calendar.set(Calendar.MILLISECOND, 0);
 calendar.set(Calendar.SECOND, 0);
 calendar.set(Calendar.MINUTE, 0);
 calendar.set(Calendar.HOUR, 0);
 calendar.set(2018, 5, 10);// 输出 Sun Jun 10 15:00:00 CST 2018
  //calendar.set(2018, 2, 10); // 输出 Sat Mar 10 16:00:00 CST 2018
 calendar.setTimeZone(timeZone);
 System.out.println(calendar.getTime());

如果要获得某个时区是否使用了DST,可以用useDaylightTime   

 boolean isUsingDST = TimeZone.getTimeZone("America/Los_Angeles").useDaylightTime();
 System.out.println(isUsingDST);

如果要判断某个时间在某个时区是否发生了DST,可以用         

 Calendar calendarServer=Calendar.getInstance();
 calendarServer.add(Calendar.DATE, 1);
 boolean isUsingDST = clientTimeZone.inDaylightTime(calendarServer.getTime());
 System.out.println(isUsingDST);

获取当前时区和UTC的偏移量,在当前时间5月13日(发生了DLS)比较getRawOffset() 和getOffset()

 TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));//将timezone设定到发生夏令时的地区
  int rowOffSet = TimeZone.getDefault().getRawOffset();
 int offSet = TimeZone.getDefault().getOffset(System.currentTimeMillis());
  System.out.println(offSet + " " + offSet/3600000 ); // -7 hours
 System.out.println(rowOffSet + " " + rowOffSet/3600000); // -8 hours

以下是时区转化的例子

Date date = new Date(1359641834000L);// 2013-1-31 22:17:14
 String dateStr = "2013-3-31 22:17:14";
 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 dateFormat.setTimeZone(TimeZone.getTimeZone("CST"));// CST = GMT - 6(Central Standard Time (USA)而不是北京标准时间)

 try {
//  指该字串以CST来换算,所以实际时间是2013-1-31 22:17:14 CST(GMT - 6),输出是以host的时区(GMT+8)进行format,所以加14
  Date dateTmp = dateFormat.parse(dateStr);

   boolean isUsingDST = TimeZone.getTimeZone("CST").inDaylightTime(dateTmp);
  System.out.println(isUsingDST);// 输出true,因此减1个小时
  System.out.println(dateTmp);//输出 Fri Feb 01 11:17:14 CST 2013
 } catch(ParseException e) {
  e.printStackTrace();
 }
 String dateStrTmp = dateFormat.format(date);//数字是绝对时间,如果以host时区(GMT+8)来format就是22:17,这个数字以CST/GMT-6时区来format,就是-14
 System.out.println(dateStrTmp);// 输出 2013-01-31 08:17:14

到此这篇关于java时区转换的理解及示例详解的文章就介绍到这了,更多相关java时区内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍Java时区转换及Date类实现原理解析,包括了Java时区转换及Date类实现原理解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java时区转换及Date类实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一、时区的说明 地球表面按经线从东到西,被划成一个个区域,规定相邻区域的时间相差1小时。在同一区域

  • 本文向大家介绍Java中SimpleDateFormat日期格式转换详解及代码示例,包括了Java中SimpleDateFormat日期格式转换详解及代码示例的使用技巧和注意事项,需要的朋友参考一下 SimpleDateFormat是处理日期格式转换的类。 官方API_1.8关于SimpleDateFormat继承于DateFormate截图: SimpleDateFormat的构造器如下: Si

  • 本文向大家介绍Java 中的注解详解及示例代码,包括了Java 中的注解详解及示例代码的使用技巧和注意事项,需要的朋友参考一下 在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行。 注解可以做什么 Java中的注解通常扮演以下角色 编译器指令 构建时指令 运行时指令 其中 Java内

  • 本文向大家介绍Java Linkedlist原理及实例详解,包括了Java Linkedlist原理及实例详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定义:linkedlist属于链表结构,方便添加和删除元素,但查询不方便,适用于对收尾

  • 本文向大家介绍Java 数组详解及示例代码,包括了Java 数组详解及示例代码的使用技巧和注意事项,需要的朋友参考一下 下面是stackoverflow中关于数组方法的相关问题中,获得最多票数的12个数组操作方法。 1.  声明一个数组 2.  输出一个数组 3.  从一个数组创建数组列表 4.  检查一个数组是否包含某个值 5.  连接两个数组 6.  声明一个内联数组(Array inline

  • 本文向大家介绍java中Servlet监听器的工作原理及示例详解,包括了java中Servlet监听器的工作原理及示例详解的使用技巧和注意事项,需要的朋友参考一下 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。 监听器原理 监听原理 1、存在事件源 2、提供监听器 3、为事件源注册监