最近工作上遇到UTC时区时间的相互转换需求,对时区中的相关概念和相互关系比较模糊,折腾了2天,最终解决了问题,将心得、资料和结果总结一下
1、首先要对java中对日期时间时区的处理API要很清楚才行,廖雪峰的资料解释的很详细讲JDK1.8前后两套API进行了对比。 日期与时间 - 廖雪峰的官方网站研究互联网产品和技术,提供原创中文精品教程https://www.liaoxuefeng.com/wiki/1252599548343744/1255943660631584
2、对GMT UTC 夏令时等时区概念的理解 。
3、代码解决两个问题,一个是utc时区转换,一个是获取当前系统默认UTC时区便宜量HOUR
/**
* 时区时间转换
* @param time 时间字符串
* @param pattern 格式 "yyyy-MM-dd HH"
* @param fromTimeZone eg:8,0,9,-1 等等
* @param toTimeZone 同nowTimeZone
* @return
*/
public static String timeZoneTransfer(String time, String pattern, int fromTimeZone, int toTimeZone) {
ZoneOffset fromZoneOffset = ZoneOffset.ofHours(fromTimeZone);
ZoneOffset toZoneOffset = ZoneOffset.ofHours(toTimeZone);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
ZonedDateTime from = LocalDateTime.parse(time, formatter).atZone(ZoneId.ofOffset("UTC", fromZoneOffset));
ZonedDateTime to = from.withZoneSameInstant(ZoneId.ofOffset("UTC", toZoneOffset));
return to.format(formatter);
}
/**
* 获取系统时区偏移数值(hour)
* @return
*/
public static int getZoneOffsetHour(){
return ZonedDateTime.now().getOffset().getTotalSeconds()/3600;
}