[英]Android how to get time difference between two time zones in android?
我需要获取不同时区的两个日期之间的时差。 目前我正在这样做:
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();
我得到0
小时。 我究竟做错了什么?
getTimeInMillis()
返回自 UTC 纪元以来的毫秒数。 换句话说,时区与它无关。
我怀疑你实际上想要:
long currentTime = System.currentTimeMillis();
int edtOffset = TimeZone.getTimeZone("EDT").getOffset(currentTime);
int gmtOffset = TimeZone.getTimeZone("GMT").getOffset(currentTime);
int hourDifference = (gmtOffset - edtOffset) / (1000 * 60 * 60);
String diff = hourDifference + " hours";
乔恩很接近,但由于字符限制,我无法编辑他的答案。 这是相同的代码,但东部标准时间的“EDT”更改为“EST”。
long currentTime = System.currentTimeMillis();
int edtOffset = TimeZone.getTimeZone("EST").getOffset(currentTime);
int gmtOffset = TimeZone.getTimeZone("GMT").getOffset(currentTime);
int hourDifference = (gmtOffset - edtOffset) / (1000 * 60 * 60);
String diff = hourDifference + " hours";
但是这个解决方案主要假设 TimeZone.getAvailableIDs() 在它的字符串数组中包含“EST”和“GMT”。 如果该方法不包含那些时区字符串,它将以 0 偏移量返回。
当时写的问题和答案使用java.util
date-time API,这是 2011 年的正确做法。2014 年 3 月, 现代日期时间 API作为Java 8 标准库的一部分发布,取代了遗留日期时间 API,从那时起强烈建议切换到java.time
,现代日期时间 API。
java.time
解决方案不要使用三字母时区 ID :在使用现代日期时间 API 之前,让我们看看 Java 7 Timezone
文档中的以下重要说明:
三字母时区 ID
为了与 JDK 1.1.x 兼容,还支持其他一些三字母时区 ID(例如“PST”、“CTT”、“AST”)。 但是,它们的使用已被弃用,因为相同的缩写经常用于多个时区(例如,“CST”可能是美国的“Central Standard Time”和“China Standard Time”),Java 平台只能识别其中一个他们。
所需的解决方案:
import java.time.Instant;
import java.time.ZoneId;
import java.util.concurrent.TimeUnit;
class Main {
public static void main(String[] args) {
Instant now = Instant.now();
long offest1InSec = ZoneId.of("America/New_York").getRules().getOffset(now).getTotalSeconds();
long offest2InSec = ZoneId.of("Etc/UTC").getRules().getOffset(now).getTotalSeconds();
long hours = TimeUnit.HOURS.convert(offest2InSec - offest1InSec, TimeUnit.SECONDS);
System.out.println(hours);
}
}
Output 现在* :
5
上述方案是任意两个时区的通用方案。 但是,如果所需的差异来自 GMT/UTC,它会变得更简单。 在这种情况下,您不需要计算差异,因为时区的偏移量总是给出 w.r.t。 偏移量为00:00
的 UTC。
演示:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.concurrent.TimeUnit;
class Main {
public static void main(String[] args) {
long hours = Math.abs(TimeUnit.HOURS.convert(
ZoneId.of("America/New_York").getRules().getOffset(Instant.now()).getTotalSeconds(), TimeUnit.SECONDS));
System.out.println(hours);
// Alternatively,
hours = Math.abs(TimeUnit.HOURS.convert(
ZonedDateTime.now(ZoneId.of("America/New_York")).getOffset().getTotalSeconds(), TimeUnit.SECONDS));
System.out.println(hours);
}
}
Output :
5
5
从Trail:Date Time了解有关现代日期时间 API 的更多信息。
* 美国东部时间(例如America/New_York )遵守夏令时。 在 DST 期间,它与 UTC 的偏移量是 4 小时,在非 DST 期间(例如现在,2023 年 1 月 28 日),它是 5 小时。 检查此页面以了解更多信息。
这是我的代码二计算两个不同时区之间的时间差。 像当前时区(GMT+05:00)和外国时区(GMT+05:30)。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
LocalDate today = LocalDate.now();
Duration timeDifference = Duration.between(today.atStartOfDay(ZoneId.of(foreigntimezone)), today.atStartOfDay(ZoneId.of(currenttimezone)));
holder.textViewTimeDifference.setText(timeDifference.toString());
} else {
long now = System.currentTimeMillis();
long diffMilliSeconds = TimeZone.getTimeZone(gmtReplaceUTC).getOffset(now) - TimeZone.getTimeZone(currentTimeZone).getOffset(now);
if (diffMilliSeconds > 0) {
String timeDifference = formatTime(diffMilliSeconds);
holder.textViewTimeDifference.setText(timeDifference);
} else {
String timeDifference = formatTime(-diffMilliSeconds);
holder.textViewTimeDifference.setText("-" + timeDifference);
}
}
}
结果:对于 26 以上 API 级别 (PT+30M) 和以下 (30:00)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.