java中转换不同时区的时间

一丶时区

由于世界各国家与地区经度不同,地方时也有所不同,因此会划分为不同的时区。

地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早。东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,这给人们带来不便。

为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区)、东1—12区,西1—12区。每个时区横跨经度15度,时间正好是1小时。最后的东、西第12区各跨经度7.5度,以东、西经180度为界。每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时。

计算的区时=已知区时-(已知区时的时区-要计算区时的时区)。(注:东时区为正,西时区为负)

例1:已知东京(东九区)时间为5月1日12:00,求北京(东八区)的区时。

北京时间=12:00-(9-8)=11:00,即北京时间为5月1日11:00。

例2:已知北京时间为5月1日12:00,求伦敦(中时区)的区时。

伦敦时间=12:00-(8-0)=4:00,即伦敦时间为5月1日4:00。

二丶UTC时间 与 格林尼治时间

协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。

格林尼治标准时间(Greenwich Mean Time,GMT)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。 地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。现在的标准时间——协调世界时(UTC)——由原子钟提供。 自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。而UTC是基于标准的GMT提供的准确时间。

GMT(Greenwich Mean Time)——格林尼治标准时间,格林尼治标准时间是19 世纪中叶大英帝国的基准时间,同时也是事实上的世界基准时间。当时主要为了1840 年之后的铁路系统服务。它以格林尼治天文台的经线为0 度经线,将世界分为24 个时区。为了方便,在不需要精确到秒的情况下,通常将GMT 和UTC 视作等同。但UTC 更加科学更加精确,它是以原子时为基础,在时刻上尽量接近世界时的一种时间计量系统。它的出现是现代社会对于精确计时的需要。

夏令时,表示为了节约能源,人为规定时间的意思。也叫夏时制,夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。

中国已不使用夏令时.

五丶区时转换

计算区时(时间) - 已知区时(时间) = 计算时区 - 已知区时的时区.

所以, 计算区时(时间)= 已知区时(时间) + 计算时区 - 已知区时的时区.

需要注意的是, 有的地区在夏季使用夏令时, 即时钟会拨快一个小时.

DateUtils.java

/*** 将本地时间, 转换成目标时区的时间

*@paramsourceDate

*@paramtargetZoneId {@linkZoneIds}

*@return

*/

public staticDate convertTimezone(Date sourceDate, String targetZoneId){returnconvertTimezone(sourceDate, TimeZone.getTimeZone(targetZoneId));

}public staticDate convertTimezone(Date sourceDate, String sourceZoneId, String targetZoneId){

TimeZone sourceTimeZone=TimeZone.getTimeZone(sourceZoneId);

TimeZone targetTimeZone=TimeZone.getTimeZone(targetZoneId);returnconvertTimezone(sourceDate, sourceTimeZone, targetTimeZone);

}/*** 将本地时间,转换成对应时区的时间

*@paramlocalDate

*@paramtargetTimezone 转换成目标时区所在的时间

*@return

*/

public staticDate convertTimezone(Date localDate, TimeZone targetTimezone){returnconvertTimezone(localDate, TimeZone.getDefault(), targetTimezone);

}/*** 将sourceDate转换成指定时区的时间

*@paramsourceDate

*@paramsourceTimezone sourceDate所在的时区

*@paramtargetTimezone 转化成目标时间所在的时区

*@return

*/

public staticDate convertTimezone(Date sourceDate, TimeZone sourceTimezone, TimeZone targetTimezone){//targetDate - sourceDate=targetTimezone-sourceTimezone//--->//targetDate=sourceDate + (targetTimezone-sourceTimezone)

Calendar calendar=Calendar.getInstance();

//date.getTime() 为时间戳, 为格林尼治到系统现在的时间差,世界各个地方获取的时间戳是一样的,

// 格式化输出时,因为设置了不同的时区,所以输出不一样long sourceTime=sourceDate.getTime();

calendar.setTimeZone(sourceTimezone);

calendar.setTimeInMillis(sourceTime);//设置之后,calendar会计算各种filed对应的值,并保存//获取源时区的到UTC的时区差

int sourceZoneOffset=calendar.get(Calendar.ZONE_OFFSET);

calendar.setTimeZone(targetTimezone);

calendar.setTimeInMillis(sourceTime);int targetZoneOffset=calendar.get(Calendar.ZONE_OFFSET);int targetDaylightOffset=calendar.get(Calendar.DST_OFFSET); //夏令时

long targetTime=sourceTime+ (targetZoneOffset+targetDaylightOffset) -sourceZoneOffset;return newDate(targetTime);

}

ZoneIds.java

/***

*@seejava.time.ZoneId#SHORT_IDS

*@authorTimFruit

* @date 19-11-2 下午6:02*/

public classZoneIds {/*EST - -05:00

HST - -10:00

MST - -07:00

ACT - Australia/Darwin

AET - Australia/Sydney

AGT - America/Argentina/Buenos_Aires

ART - Africa/Cairo

AST - America/Anchorage

BET - America/Sao_Paulo

BST - Asia/Dhaka

CAT - Africa/Harare

CNT - America/St_Johns

CST - America/Chicago

CTT - Asia/Shanghai

EAT - Africa/Addis_Ababa

ECT - Europe/Paris

IET - America/Indiana/Indianapolis

IST - Asia/Kolkata

JST - Asia/Tokyo

MIT - Pacific/Apia

NET - Asia/Yerevan

NST - Pacific/Auckland

PLT - Asia/Karachi

PNT - America/Phoenix

PRT - America/Puerto_Rico

PST - America/Los_Angeles

SST - Pacific/Guadalcanal

VST - Asia/Ho_Chi_Min*/

public static final String UTC="Z";//utc国际时间

public static final String DEFAULT=TimeZone.getDefault().toZoneId().getId();public static final String BEIJING="Asia/Shanghai"; //也可以使用"+8" 北京在东8区//

//UTC+10 夏莫罗标准时区//UTC-11 美属萨摩亚标准时区//UTC-10HST夏威夷-阿留申标准时区//UTC-9AKST阿拉斯加标准时区//UTC-8PST太平洋标准时区//UTC-7MST山地标准时区//UTC-6CST中部标准时区//UTC-5EST东部标准时区//UTC-4AST大西洋标准时区//https://baike.baidu.com/item/%E7%BE%8E%E5%9B%BD%E6%97%B6%E9%97%B4/3163209?fr=aladdin

/*太平洋时区:代表城市洛杉矶,与北京相差16小时;

山地时区:代表城市盐湖城,与北京相差15小时;

中部时区:代表城市芝加哥,与北京相差14小时;

东部时区:代表城市纽约、华盛顿,与北京相差13小时;

夏威夷时区:代表城市:火奴鲁鲁,与北京相差18小时;

阿拉斯加时区:代表城市:费尔班克斯,与北京相差17小时。*/

public static final String US_EST="-5"; //东部标准时区

public static final String US_CST="-6";//中部标准时区

public static final String US_MST="-7";//山地标准时区

public static final String US_PST="America/Los_Angeles"; //也可以使用"-8" 太平洋标准时区

public static final String JST="Asia/Tokyo";//日本东京

}

测试:

@Testpublic voidconvertTimezonePstNowTest(){//太平洋时区:代表城市洛杉矶,与北京相差16小时;//但由于实行夏令时, 夏季会快一个小时

Date now=newDate();

convertTimeZonePstTest(now);

}

@Testpublic voidconvertTimezonePstTest1(){//太平洋时区:代表城市洛杉矶,与北京相差16小时;//但由于实行夏令时, 夏季会快一个小时

Date now=DateUtils.parse("2019-11-03 03:00:00");

convertTimeZonePstTest(now);

now=DateUtils.parse("2019-11-03 06:00:00");

convertTimeZonePstTest(now);

now=DateUtils.parse("2019-11-03 09:00:00");

convertTimeZonePstTest(now);

now=DateUtils.parse("2019-11-03 11:00:00");

convertTimeZonePstTest(now);

now=DateUtils.parse("2019-11-03 14:00:00");

convertTimeZonePstTest(now);

now=DateUtils.parse("2019-11-03 16:00:00");

convertTimeZonePstTest(now);

now=DateUtils.parse("2019-11-03 18:00:00");

convertTimeZonePstTest(now);

now=DateUtils.parse("2019-11-03 19:00:00");

convertTimeZonePstTest(now);

now=DateUtils.parse("2019-11-03 20:00:00");

convertTimeZonePstTest(now);

now=DateUtils.parse("2019-11-03 23:00:00");

convertTimeZonePstTest(now);

}private voidconvertTimeZonePstTest(Date sourceDate){

Date target=DateUtils.convertTimezone(sourceDate, ZoneIds.US_PST);long sub=sourceDate.getTime()-target.getTime();

System.out.println("北京时间与洛杉矶时间相差时间: "+sub/(60*60*1000) +" 小时");//由于有夏令时, 使用jdk提供的方法验证

SimpleDateFormat pstSdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

pstSdf.setTimeZone(TimeZone.getTimeZone(ZoneIds.US_PST));

String expectFormat=pstSdf.format(sourceDate);

String targetFormat=DateUtils.format(target);

System.out.println("洛杉矶时间: "+targetFormat);

Assert.assertEquals(expectFormat,targetFormat);

}

不同时区时间换算_java中转换不同时区的时间相关推荐

  1. Java中输出时区的缩写_Java中的时区转换小结

    时间加减 Date currentDate = new Date(System.currentTimeMillis()); Calendar cal = Calendar.getInstance(); ...

  2. vba 时间换算_VBA中的汇率和货币换算

    vba 时间换算 服务及其功能 (Services and their features) Exchange rates can be obtained from many sources, some ...

  3. java 时区 不正确_Java中的时区不匹配

    我在美国的Ubuntu服务器中运行一个Java应用程序,并配置了CEST时区. 如果我在终端中运行Date命令,它将以CEST Zone时间返回日期-这是完美的. 但是在Java中,如果我运行以下代码 ...

  4. java 时间字符串比较大小_java中如何比较两个时间字符串的大小

    思路: 先都转换成日期.然后再用毫秒数进行比较. 下面是简单的例子: function tab(date1,date2){ var oDate1 = new Date(date1); var oDat ...

  5. java cookie过期_Java中Servlet Cookie设置过期时间(expires,max-age)

    Java中Servlet Cookie设置过期时间(expires,max-age) expires或者max-age指定了coolie的生存期,默认情况下coolie是暂时存在的,他们存储的值只在浏 ...

  6. java代码中设置mysql时区_关于Java中的mysql时区问题详解

    前言 话说工作十多年,mysql 还真没用几年.起初是外企银行,无法直接接触到 DB:后来一直从事架构方面,也多是解决问题为主. 这次搭建海外机房,围绕时区大家做了一番讨论.不说最终的结果是什么,期间 ...

  7. java 当前时间格式_JAVA中获取当前系统时间及格式转换

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

  8. java年份换算_java中日期的换算处理

    JAVA8中的日期API是JSR-310的实现,并且是工作在ISO-8601日历系统基础上的,但我们也可以在非ISO的日历上. JDK8的日期API大致分为以下几个包: 1 java.time包:JD ...

  9. java时间设置_JAVA中的时间操作

    java中的时间操作不外乎这四种情况: 1.获取当前时间 2.获取某个时间的某种格式 3.设置时间 4.时间的运算 好,下面就针对这四种情况,一个一个搞定. 一.获取当前时间 有两种方式可以获得,第一 ...

  10. 时区 java 巴黎_java中的时区陷阱 - iasuna

    今天碰到一个很奇怪的问题,就是在调用SimpleDateFormat类的parse方法,得到了意外的结果. public static void main(String[] args) throws ...

最新文章

  1. Android + Eclipse + PhoneGap 2.9.0 安卓最新环境配置,部分资料整合网上资料,已成功安装....
  2. head rush ajax chapter4 DOM
  3. 欧盟无条件批准甲骨文收购Sun
  4. 1/4美国理工博士生中途离学 | Science:原因何在?
  5. 【flink】Flink 1.12.2 源码浅析 :Task数据输出
  6. 【带着canvas去流浪(5)】绘制K线图
  7. 动态规划---01背包问题--Dp(详解附代码)
  8. VFIO代码分析(5)VFIO-IOMMU驱动
  9. 最新声鉴卡H5网页源码_完整可运转,引流专用神器
  10. AutoCAD打印图纸如何使参照底图灰度显示
  11. 移动WEB开发布局中的-box-sizing:border-box
  12. 2021洛谷10月月赛3游记
  13. Mac应用程序无法打开或文件损坏的处理方法
  14. 剑指 Offer 05. 替换空格(完整代码)
  15. 阿里云最简单的认证是什么?考试费用是多少?
  16. Echarts 漏斗图
  17. APP、PC客户端抓包、小程序\公众号
  18. 【Shader进阶】Shader的Lod
  19. PHP 蒙太奇马赛克拼图,AndreaMosaic制作一幅马赛克拼图
  20. 罗振宇2023“时间的朋友”跨年演讲原版PPT(附下载)

热门文章

  1. VScode输入感叹号无法生成HTML模板
  2. 行人跟踪之身份识别(一)
  3. 千千静听界面模拟(C#)
  4. 超大水箱持久水润,让这个冬天不干燥,摩飞有雾加湿器体验
  5. ant design框架学习
  6. 神界计算机丢失msvcp120.dll,Win7系统msvcp120.dll丢失的解决方法
  7. 设置计算机每天定时自动开关机,如何设置电脑定时自动关机?
  8. 空格符号复制html,空格网名符号复制
  9. 五大云存储服务对比:iCloud、Google...
  10. 自强不息系列之Python 选择排序