为何不同时区解析相同日期计算出的时差与实际存在偏差?
时区差计算异常问题分析
以下是一个尝试计算不同时区之间小时差的示例代码:
import java.util.*; import java.text.*; public class ForPosting { public static void main (String[] args) { try { String myDateString = "07-13-2021 11:00:00"; SimpleDateFormat localDateTime = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss"); SimpleDateFormat utcDateTime = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss"); localDateTime.setTimeZone(TimeZone.getTimeZone("EET")); System.out.println(localDateTime.parse(myDateString)); utcDateTime.setTimeZone(TimeZone.getTimeZone("UTC")); System.out.println(utcDateTime.parse(myDateString)); float diff = ((localDateTime.parse(myDateString).getTime() - utcDateTime.parse(myDateString).getTime() ) / 3600000); System.out.println("EET & UTC Time Difference : " + diff); localDateTime.setTimeZone(TimeZone.getDefault()); System.out.println(localDateTime.parse(myDateString)); utcDateTime.setTimeZone(TimeZone.getTimeZone("UTC")); System.out.println(utcDateTime.parse(myDateString)); diff = ((localDateTime.parse(myDateString).getTime() - utcDateTime.parse(myDateString).getTime() ) / 3600000); System.out.println("Default & UTC Time Difference : " + diff); } catch (ParseException e) { e.printStackTrace(); } } }
上述代码运行后得到的Default & UTC Time Difference : 4.0结果符合实际,但EET与UTC的时差输出为-3.0,和查询到的EET标准时差2小时不符,原因如下:
- 夏令时规则自动适配:代码测试用的日期为2021年7月13日,属于北半球夏季,大部分实行EET(东欧标准时,UTC+2)的地区会在夏季切换为东欧夏令时(EEST,UTC+3)。Java的
TimeZone.getTimeZone("EET")默认会自动加载对应地区的夏令时规则,因此7月计算得到的偏移量会包含夏令时额外的1小时偏移,最终结果为3小时。 - 计算逻辑写反且未区分标准偏移/实际偏移:代码中计算时差的逻辑是
EET时区解析得到的时间戳 - UTC时区解析得到的时间戳,而SimpleDateFormat.parse()的作用是把输入的字符串当成对应时区的时间,转换为UTC时间戳。比如同样输入11:00:00,用EET解析得到的是EET 11点对应的UTC 8点的时间戳,用UTC解析得到的是UTC 11点的时间戳,两者相减自然得到-3小时的结果。如果要获取不随日期变化的标准时区偏移,应该直接调用TimeZone.getRawOffset()方法计算,不需要通过解析自定义日期实现。
如果希望得到EET的标准2小时偏移,可以将计算逻辑替换为:
int rawOffsetHour = TimeZone.getTimeZone("EET").getRawOffset() / 3600000; System.out.println("EET标准时区偏移:" + rawOffsetHour);
内容的提问来源于stack exchange,提问作者Unhandled Exception
相关产品推荐
相关产品推荐

