java转换时区时间过程详解
这篇文章主要介绍了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。
格林尼治标准时间(GreenwichMeanTime,GMT)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。现在的标准时间——协调世界时(UTC)——由原子钟提供。自1924年2月5日开始,格林尼治天文台每隔一小时会向全世界发放调时信息。而UTC是基于标准的GMT提供的准确时间。
GMT(GreenwichMeanTime)——格林尼治标准时间,格林尼治标准时间是19世纪中叶大英帝国的基准时间,同时也是事实上的世界基准时间。当时主要为了1840年之后的铁路系统服务。它以格林尼治天文台的经线为0度经线,将世界分为24个时区。为了方便,在不需要精确到秒的情况下,通常将GMT和UTC视作等同。但UTC更加科学更加精确,它是以原子时为基础,在时刻上尽量接近世界时的一种时间计量系统。它的出现是现代社会对于精确计时的需要。
三丶夏令时
夏令时,表示为了节约能源,人为规定时间的意思。也叫夏时制,夏时令(DaylightSavingTime:DST),又称“日光节约时制”和“夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。
中国已不使用夏令时.
四丶区时转换
计算区时(时间)-已知区时(时间)=计算时区-已知区时的时区.
所以,计算区时(时间)=已知区时(时间)+计算时区-已知区时的时区.
需要注意的是,有的地区在夏季使用夏令时,即时钟会拨快一个小时.
DateUtils.java
/** *将本地时间,转换成目标时区的时间 *@paramsourceDate *@paramtargetZoneId{@linkZoneIds} *@return */ publicstaticDateconvertTimezone(DatesourceDate,StringtargetZoneId){ returnconvertTimezone(sourceDate,TimeZone.getTimeZone(targetZoneId)); } publicstaticDateconvertTimezone(DatesourceDate,StringsourceZoneId,StringtargetZoneId){ TimeZonesourceTimeZone=TimeZone.getTimeZone(sourceZoneId); TimeZonetargetTimeZone=TimeZone.getTimeZone(targetZoneId); returnconvertTimezone(sourceDate,sourceTimeZone,targetTimeZone); } /** *将本地时间,转换成对应时区的时间 *@paramlocalDate *@paramtargetTimezone转换成目标时区所在的时间 *@return */ publicstaticDateconvertTimezone(DatelocalDate,TimeZonetargetTimezone){ returnconvertTimezone(localDate,TimeZone.getDefault(),targetTimezone); } /** *将sourceDate转换成指定时区的时间 *@paramsourceDate *@paramsourceTimezonesourceDate所在的时区 *@paramtargetTimezone转化成目标时间所在的时区 *@return */ publicstaticDateconvertTimezone(DatesourceDate,TimeZonesourceTimezone,TimeZonetargetTimezone){ //targetDate-sourceDate=targetTimezone-sourceTimezone //---> //targetDate=sourceDate+(targetTimezone-sourceTimezone) Calendarcalendar=Calendar.getInstance();//date.getTime()为时间戳,为格林尼治到系统现在的时间差,世界各个地方获取的时间戳是一样的,//格式化输出时,因为设置了不同的时区,所以输出不一样 longsourceTime=sourceDate.getTime(); calendar.setTimeZone(sourceTimezone); calendar.setTimeInMillis(sourceTime);//设置之后,calendar会计算各种filed对应的值,并保存 //获取源时区的到UTC的时区差 intsourceZoneOffset=calendar.get(Calendar.ZONE_OFFSET); calendar.setTimeZone(targetTimezone); calendar.setTimeInMillis(sourceTime); inttargetZoneOffset=calendar.get(Calendar.ZONE_OFFSET); inttargetDaylightOffset=calendar.get(Calendar.DST_OFFSET);//夏令时 longtargetTime=sourceTime+(targetZoneOffset+targetDaylightOffset)-sourceZoneOffset; returnnewDate(targetTime); }
ZoneIds.java
/** * *@seejava.time.ZoneId#SHORT_IDS *@authorTimFruit *@date19-11-2下午6:02 */ publicclassZoneIds{ /* 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 */ publicstaticfinalStringUTC="Z";//utc国际时间 publicstaticfinalStringDEFAULT=TimeZone.getDefault().toZoneId().getId(); publicstaticfinalStringBEIJING="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小时。 */ publicstaticfinalStringUS_EST="-5";//东部标准时区 publicstaticfinalStringUS_CST="-6";//中部标准时区 publicstaticfinalStringUS_MST="-7";//山地标准时区 publicstaticfinalStringUS_PST="America/Los_Angeles";//也可以使用"-8"太平洋标准时区 publicstaticfinalStringJST="Asia/Tokyo";//日本东京 }
测试:
@Test publicvoidconvertTimezonePstNowTest(){ //太平洋时区:代表城市洛杉矶,与北京相差16小时; //但由于实行夏令时,夏季会快一个小时 Datenow=newDate(); convertTimeZonePstTest(now); } @Test publicvoidconvertTimezonePstTest1(){ //太平洋时区:代表城市洛杉矶,与北京相差16小时; //但由于实行夏令时,夏季会快一个小时 Datenow=DateUtils.parse("2019-11-0303:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-0306:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-0309:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-0311:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-0314:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-0316:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-0318:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-0319:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-0320:00:00"); convertTimeZonePstTest(now); now=DateUtils.parse("2019-11-0323:00:00"); convertTimeZonePstTest(now); } privatevoidconvertTimeZonePstTest(DatesourceDate){ Datetarget=DateUtils.convertTimezone(sourceDate,ZoneIds.US_PST); longsub=sourceDate.getTime()-target.getTime(); System.out.println("北京时间与洛杉矶时间相差时间:"+sub/(60*60*1000)+"小时"); //由于有夏令时,使用jdk提供的方法验证 SimpleDateFormatpstSdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); pstSdf.setTimeZone(TimeZone.getTimeZone(ZoneIds.US_PST)); StringexpectFormat=pstSdf.format(sourceDate); StringtargetFormat=DateUtils.format(target); System.out.println("洛杉矶时间:"+targetFormat); Assert.assertEquals(expectFormat,targetFormat); }
完整源码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。