java时区转换的理解及示例详解
一、时区的基本概念
GMT(GreenwichMeanTime),即格林威治标准时,是东西经零度的地方。人们将地球人为的分为24等份,每一等份为一个时区,每时区横跨经度15度,时间正好为1小时。往西一个时区,则减去一小时;往东一个时区,则加上一小时。中国在东经120度上,(东经120°-东经0°)所得度数再除以15,即得8。
UTC(CoordinatedUniversalTime),即世界协调时间,是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。UTC的本质强调的是比GMT更为精确的世界时间标准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。
CST时间却同时可以代表如下4个不同的时区:
- CentralStandardTime(USA)UT-6:00
- CentralStandardTime(Australia)UT+9:30
- ChinaStandardTimeUT+8:00
- CubaStandardTimeUT-4:00
可见,CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。
DST(DaylightSavingTime),夏日节约时间,指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用,在英国则称为夏令时间(SummerTime)。
PDT以及PST,PDT是PacificDaylightTime的缩写,美国夏季始于每年4月的第1个周日,止于每年10月的最后一个周日。夏令时比正常时间早一小时,与PDT时间相对应的是PST,PacificStandardTime。夏时制结束后就是PST(太平洋标准时间),西八区,与北京时间(东八区)时差-16个小时。
二、java中的时区
可以用以下code,列出java中的时区
Stringids[]=TimeZone.getAvailableIDs(); for(Stringid:ids){ System.out.println(id); }
注意:你会发现在PDT不在该时区列表里
如果要用PDT,用PST作为时区可以得到准确的时间,即使是夏令时
TimeZonetimeZone=TimeZone.getTimeZone("PST"); Calendarcalendar=newGregorianCalendar(); 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);//输出SunJun1015:00:00CST2018 //calendar.set(2018,2,10);//输出SatMar1016:00:00CST2018 calendar.setTimeZone(timeZone); System.out.println(calendar.getTime());
如果要获得某个时区是否使用了DST,可以用useDaylightTime
booleanisUsingDST=TimeZone.getTimeZone("America/Los_Angeles").useDaylightTime(); System.out.println(isUsingDST);
如果要判断某个时间在某个时区是否发生了DST,可以用
CalendarcalendarServer=Calendar.getInstance(); calendarServer.add(Calendar.DATE,1); booleanisUsingDST=clientTimeZone.inDaylightTime(calendarServer.getTime()); System.out.println(isUsingDST);
获取当前时区和UTC的偏移量,在当前时间5月13日(发生了DLS)比较getRawOffset()和getOffset()
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));//将timezone设定到发生夏令时的地区 introwOffSet=TimeZone.getDefault().getRawOffset(); intoffSet=TimeZone.getDefault().getOffset(System.currentTimeMillis()); System.out.println(offSet+""+offSet/3600000);//-7hours System.out.println(rowOffSet+""+rowOffSet/3600000);//-8hours
以下是时区转化的例子
Datedate=newDate(1359641834000L);//2013-1-3122:17:14 StringdateStr="2013-3-3122:17:14"; SimpleDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("CST"));//CST=GMT-6(CentralStandardTime(USA)而不是北京标准时间) try{ //指该字串以CST来换算,所以实际时间是2013-1-3122:17:14CST(GMT-6),输出是以host的时区(GMT+8)进行format,所以加14 DatedateTmp=dateFormat.parse(dateStr); booleanisUsingDST=TimeZone.getTimeZone("CST").inDaylightTime(dateTmp); System.out.println(isUsingDST);//输出true,因此减1个小时 System.out.println(dateTmp);//输出FriFeb0111:17:14CST2013 }catch(ParseExceptione){ e.printStackTrace(); } StringdateStrTmp=dateFormat.format(date);//数字是绝对时间,如果以host时区(GMT+8)来format就是22:17,这个数字以CST/GMT-6时区来format,就是-14 System.out.println(dateStrTmp);//输出2013-01-3108:17:14
到此这篇关于java时区转换的理解及示例详解的文章就介绍到这了,更多相关java时区内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!