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

作者:Even 时间:2022-01-19 08:35:20 

一、时区的基本概念

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

来源:https://segmentfault.com/a/1190000014848738

标签:java,时区,时区转换
0
投稿

猜你喜欢

  • Java数据结构学习之栈和队列

    2022-02-21 11:32:45
  • 详解Java语言中一个字符占几个字节?

    2023-08-26 11:45:40
  • springboot与vue详解实现短信发送流程

    2023-05-24 14:55:29
  • Java 逻辑控制详解分析

    2023-08-13 20:08:11
  • Springboot如何添加server.servlet.context-path相关使用

    2023-03-14 10:35:03
  • java 读取本地文件实例详解

    2023-08-12 20:41:32
  • C#之CLR内存原理初探

    2023-02-16 00:58:09
  • java-制表符\\t的使用说明

    2023-12-03 10:18:02
  • 详解RestTemplate的三种使用方式

    2023-06-07 16:30:45
  • Java判断线程池线程是否执行完毕

    2023-10-18 12:09:29
  • java读取xml配置参数代码实例

    2023-11-25 03:03:17
  • java如何导出insert语句并生成sql脚本

    2022-05-18 10:33:54
  • 通过Java设置Word页面背景色过程详解

    2022-06-22 06:23:42
  • Mybatis Plus代码生成器(时间管理大师)

    2023-01-30 16:27:35
  • Android实现文字垂直滚动、纵向走马灯效果的实现方式汇总

    2023-03-02 22:24:54
  • Spring boot的上传图片功能实例详解

    2022-10-09 09:52:00
  • 读取spring配置文件的方法(spring读取资源文件)

    2022-10-08 11:24:21
  • jdk源码阅读Collection详解

    2022-07-25 08:57:40
  • 在Eclipse中使用版本管理工具SVN的图文教程

    2022-07-21 17:39:51
  • C#高性能动态获取对象属性值的步骤

    2022-08-13 13:23:12
  • asp之家 软件编程 m.aspxhome.com