GMT中的Java时区代码帮助

时间:2017-04-25 05:51:11

标签: java timezone timezone-offset

您能帮助理解这段代码吗?看起来它正在获得时区作为GMT的抵消时间。但不确定......

代码中DST的考虑因素是什么?

请帮忙。

// Time zone offset in hours from GMT
    TimeZone timezone = TimeZone.getDefault();
    String result  = CCUtil.getTimeZoneOffSet(timezone);


CCUtil.java         
public static String getTimeZoneOffSet(TimeZone tz) {
        String result = "";
        int offSet = tz.getOffset(Calendar.getInstance().getTimeInMillis());
        String sign = "-";
        if (offSet >= 0)
            sign = "+";
        else
            offSet = Integer.parseInt(Integer.toString(offSet).substring(1));

        int minutes = offSet / (1000 * 60);
        int hours = minutes / 60;
        minutes = minutes % 60;
        result = sign + lpad(Integer.toString(hours), "00") + ":"
                + lpad(Integer.toString(minutes), "00");

        return result;
    }

    private static String lpad(String str, String pad) {
        int strLen = str.length();
        int padLen = pad.length();
        String result = str;
        if (strLen < padLen) {
            result = pad.substring(0, padLen - strLen) + result;
        }
        return result;
    }

1 个答案:

答案 0 :(得分:3)

首先,像这样的代码几乎总是是一个错误。 Java在日期/时间类型的文本格式化方面提供了很多选项......我建议尽可能使用java.time

但是,就此代码如何考虑DST而言,这是相关的一行:

int offSet = tz.getOffset(Calendar.getInstance().getTimeInMillis());

创建Calendar毫无意义 - 这会更简单:

int offSet = tz.getOffset(System.currentTimeMillis());

他们都做同样的事情:从UTC获得当前偏移量。来自TimeZone.getOffset

  

在指定日期返回此时区与UTC的偏移量。如果夏令时在指定日期生效,则使用夏令时量调整偏移值。

当然,只适用于当前时间的 - 它可能在一分钟之前有所不同,并且在一分钟之内可能会有所不同。如果您刚刚格式化了当前日期/时间,则可能在格式化和格式之间,时区偏移已更改。避免此代码的另一个原因。