我需要获取不同时区的两个日期之间的时差。目前我正在执行以下操作:
Calendar c1=Calendar.getInstance(TimeZone.getTimeZone("EDT"));
Calendar c2=Calendar.getInstance(TimeZone.getTimeZone("GMT"));
String diff=((c2.getTimeInMillis()-c1.getTimeInMillis())/(1000*60*60))+" hours";
new AlertDialog.Builder(this).setMessage(diff).create().show();
我有100n1x个小时。我做错什么了?
4条答案
按热度按时间whlutmcx1#
getTimeInMillis()
返回UTC* 中的纪元以来的毫秒数 *。换句话说,时区与它无关。我怀疑你实际上想要:
...其中
srcZoneId
和targetZoneId
是 valid 时区ID。注意“EDT”不是时区ID;最多是“半个时区”。我强烈建议避免使用3个字母的缩写,因为它们实际上并不能识别时区。例如,使用“America/New_约克”和“Europe/伦敦”就可以了。当然,尽管上述方法在2011年是一种合理的方法,但如果您使用的是Java8或更高版本,那么使用java.time中的类(而不是
java.util.Calendar
、java.util.TimeZone
等)肯定是值得的。atmip9wb2#
乔恩很接近,但由于字符限制,我不能编辑他的答案。这是相同的代码,但“EDT”改为“EST”的东部标准时间。
但是这个解决方案做了一个主要的假设,TimeZone.getAvailableIDs()在它的字符串数组中有“EST”和“GMT”,如果这个方法不包含这些时区字符串,它将返回0偏移。
ztigrdn83#
Java.时间
Question和answer written at that time使用
java.util
日期-时间API,这在2011年是正确的做法。2014年3月,modern Date-Time API作为Java 8标准库的一部分发布,取代了传统的日期-时间API,从那时起,强烈建议切换到java.time
,即现代日期-时间API。使用
java.time
的解决方案Timezone
documentation中的以下重要说明:三个字母的时区ID
为了与JDK 1.1.x兼容,还支持其他一些三个字母的时区ID(如"PST"、"CTT"、"AST")。但是,它们的使用不受欢迎,因为同一缩写经常用于多个时区(例如,"CST"可能是美国的"中央标准时间"和"中国标准时间"),Java平台只能识别其中一个时区。
ONLINE DEMO
如果所需的差值与GMT/UTC不同,则会更加简单
上述解决方案是任意两个时区的通用解决方案。然而,如果所需的差值是GMT/UTC,则会变得更加简单。在这种情况下,您不需要计算差值,因为时区的偏移量总是相对于UTC(偏移量为
00:00
小时)给定的。从**Trail: Date Time**了解有关现代日期-时间API的更多信息。
fslejnso4#
这里是我的代码二计算两个不同时区之间的时差。如当前时区(格林尼治标准时间+05:00)和外国时区(格林尼治标准时间+05:30)。
结果:高于26 API水平(PT+30M)和低于26 API水平(30:00)