Android如何在android中获得两个时区之间的时差?

时间:2011-07-20 09:53:17

标签: java android timezone

我需要在不同时区的两个日期之间获得时差。目前我这样做:

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小时。我做错了什么?

3 个答案:

答案 0 :(得分:14)

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";

答案 1 :(得分:1)

Jon很亲密,但由于角色限制,我无法编辑他的答案。这是相同的代码,但东部标准时间的“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偏移量。

答案 2 :(得分:0)

这是我的代码二计算两个不同时区之间的时差。 比如当前时区(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)