Java 获取两个时区之间的时差,并相应地对当前时间进行加减
我有一个特定的要求,我必须得到系统时区和任何其他远程时区之间的差异,然后如果系统时区在远程时区之前,则将当前时间与日期相加,如果系统时区在远程时区之后,则减去当前时间 此外,还需要考虑夏令时(DST),因为代码可以部署在任何时区 我试了以下方法Java 获取两个时区之间的时差,并相应地对当前时间进行加减,java,datetime,timezone,java-time,timezone-offset,Java,Datetime,Timezone,Java Time,Timezone Offset,我有一个特定的要求,我必须得到系统时区和任何其他远程时区之间的差异,然后如果系统时区在远程时区之前,则将当前时间与日期相加,如果系统时区在远程时区之后,则减去当前时间 此外,还需要考虑夏令时(DST),因为代码可以部署在任何时区 我试了以下方法 long now = System.currentTimeMillis(); long diffGMT = TimeZone.getTimeZone(ZoneId.systemDefault()).getOffset(now) - TimeZone.g
long now = System.currentTimeMillis();
long diffGMT = TimeZone.getTimeZone(ZoneId.systemDefault()).getOffset(now) -
TimeZone.getTimeZone("GMT").getOffset(now);
long diffAEST = TimeZone.getTimeZone(ZoneId.systemDefault()).getOffset(now) -
TimeZone.getTimeZone("AEST").getOffset(now);
System.out.println("diffGMT = " + diffGMT);
System.out.println("diffAEST = " + diffAEST);
但返回的两个值都是正值
我的系统时间是IST,我试过落后的GMT和领先的AEST(澳大利亚)
我做错什么了吗
一旦我得到了想要的正时间或负时间,我就可以按照下面的代码加或减小时
long totalSecs = (calculatedValueInMillis)/1000;
long hours = (totalSecs / 3600);
long mins = (totalSecs / 60) % 60;
long secs = totalSecs % 60;
问题是“如果无法理解给定ID,则返回GMT区域”。它不会抛出异常
由于没有名为AEST
的时区,TimeZone.getTimeZone(“AEST”)
解析为GMT
解决方案:改用澳大利亚/悉尼
问题中的代码是混合时间API:
TimeZone.getTimeZone(ZoneId.systemDefault())
由于代码的其余部分使用的是旧的DateAPI,所以应该只使用它
或者,它可以使用较新的Time API,例如:
Instant now=Instant.now();
System.out.println(Date.from(now));//显示默认时区
int offsetLocal=ZoneId.systemDefault().getRules().getOffset(现在).getTotalSeconds();
int offsetSydney=ZoneId.of(“澳大利亚/悉尼”).getRules().getOffset(现在).getTotalSeconds();
int offsetGMT=0;//又名ZoneOffset.UTC.getTotalSeconds()
////又名ZoneId.of(“GMT”).getRules().getOffset(现在).getTotalSeconds()
long diffGMT=偏心-偏心GMT;
long diffAEST=非本地-非本地悉尼;
System.out.println(“diffGMT=“+diffGMT”);
System.out.println(“diffAEST=“+diffAEST”);
长时间=(diffAEST/3600);
长分钟=(diffAEST/60)%60;
长秒=diffAEST%60;
System.out.printf(“diffAEST=%02d:%02d:%02d%n”,小时,数学.abs(分钟),数学.abs(秒));
要测试是否使用系统时间列表运行,请首先添加此行(如果需要):
TimeZone.setDefault(TimeZone.getTimeZone(“亚洲/加尔各答”);
输出
2020年9月15日星期二19:44:36
diffGMT=19800
diffAEST=-16200
diffAEST=-4:30:00
时区。getTimeZone(“AEST”)
解析为GMT,因为没有名为AEST
的时区。使用澳大利亚/悉尼
代替。为什么要混合使用新旧APITimeZone.getTimeZone(ZoneId.systemDefault())
真是奇怪。要么使用旧的API,例如TimeZone.getDefault()
,要么使用新的API,例如ZoneId.of(“澳大利亚/悉尼”).getRules().getOffset(现在).getTotalSeconds()
@Andreas-是..谢谢你的建议。是的……你是对的……澳大利亚/悉尼的产出为负……部分回答了你的问题吗?@Andreas-我无法实施你的建议。请您详细说明我如何使用新的API计算系统默认时区和“澳大利亚/悉尼”时区之间的时差。如何使用新的API计算上述代码中的长diffAEST??