Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取两个时区之间的时差,并相应地对当前时间进行加减_Java_Datetime_Timezone_Java Time_Timezone Offset - Fatal编程技术网

Java 获取两个时区之间的时差,并相应地对当前时间进行加减

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

我有一个特定的要求,我必须得到系统时区和任何其他远程时区之间的差异,然后如果系统时区在远程时区之前,则将当前时间与日期相加,如果系统时区在远程时区之后,则减去当前时间

此外,还需要考虑夏令时(DST),因为代码可以部署在任何时区

我试了以下方法

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
的时区。使用
澳大利亚/悉尼
代替。为什么要混合使用新旧API
TimeZone.getTimeZone(ZoneId.systemDefault())
真是奇怪。要么使用旧的API,例如
TimeZone.getDefault()
,要么使用新的API,例如
ZoneId.of(“澳大利亚/悉尼”).getRules().getOffset(现在).getTotalSeconds()
@Andreas-是..谢谢你的建议。是的……你是对的……澳大利亚/悉尼的产出为负……部分回答了你的问题吗?@Andreas-我无法实施你的建议。请您详细说明我如何使用新的API计算系统默认时区和“澳大利亚/悉尼”时区之间的时差。如何使用新的API计算上述代码中的长diffAEST??