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 个不同的时区:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
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


猜你喜欢
- String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要
- 今天我们来看一下在C#中对象序列化XML的方法。不得不说,在这个Json横行的年代,XML虽然式微,但也的确是一股子清流。(个人感觉)不多说
- 要画这种圆形带阴影的头像,个人分解成三个图层1,先画头像边缘的渐变RadialGradient gradient = new RadialG
- 本文实例讲述了C#封装的Sqlite访问类。分享给大家供大家参考。具体分析如下:C#封装的Sqlite访问类,要访问Sqlite这下简单了,
- 在用HTML5做跨平台应用开发时,尝尝会用到java和js方法互调的问题,对初学者而言,可能会有点难,在这里分享一些自己在实际开发过程中的用
- Collection遍历方式Collection集合遍历的方式有三种:迭代器foreach/增强for循环lambda表达式迭代器遍历迭代器
- 1.1 接口组成更新概述接口的组成常量:public static final抽象方法:public abstract默认方法(Java 8
- 前言本文主要给大家介绍了关于Java中Arraylist动态扩容的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
- 最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在Te
- 数学工具类Math,供大家参考,具体内容如下1. 概述java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学
- 1、使用第三方类库 HtmlAgilityPack官方网址:https://html-agility-pack.net/?z=codeple
- 以下将是 C# 7.0 中所有计划的语言特性的描述。随着 Visual Studio “15” Preview 4 版本的发布,这些特性中的
- 在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用。该模式的结构如下所示:
- springmvc 自定义注解 以及自定义注解的解析一、自定义注解名字@Target({ElementType.TYPE, ElementT
- 前言在前面的篇章中,对Java语言的简单数据类型、数组、运算符和表达式以及流程控制的方法做了详细介绍。从本章开始,我们正式介绍面向对象的程序
- 注意是maven的webapp:选择maven下一步下一步。maven下载过慢在setting中加入镜像。 我也有疑问这是什么鬼格式,但是证
- 基础部分1. FastJson 简介Fastjson是一个Java库,可用于将Java对象转换为JSON表示。它也可以被用来将一个JSON字
- 文章描述弱水三千,我只取一瓢饮。一张动图,我只想要其中一帧。如何将一个GIF动态图分割成一帧一帧的图片?其实现在这样的工具随处可见,无论是在
- 树的同构备忘!定义:给定两棵树r1、r2,如果r1可以通过若干次的左子树和右子树互换,使之与r2完全相同,这说明两者同构。举例树的构造树可以
- 本文实例讲述了Android编程之页面切换测试。分享给大家供大家参考。具体分析如下:一、软件平台:win7 + eclipse + sdk二