【问题标题】:Android how to get time difference between two time zones in android?Android如何获取android中两个时区之间的时差?
【发布时间】:2011-10-09 06:09:26
【问题描述】:

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

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

【问题讨论】:

    标签: java android timezone


    【解决方案1】:

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

    【讨论】:

    • 如果是夏令时呢?那会处理它吗?
    • @Gugan:我不知道如果你使用时区名称的缩写会发生什么 - 但如果你给它一个完整的时区 ID,例如Europe/London,那确实可以处理夏令时。
    • 谢谢乔恩。我会检查的。
    【解决方案2】:

    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 偏移量返回。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 2013-09-08
        相关资源
        最近更新 更多