您能帮助理解这段代码吗?看起来它正在获得时区作为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;
}
答案 0 :(得分:3)
首先,像这样的代码几乎总是是一个错误。 Java在日期/时间类型的文本格式化方面提供了很多选项......我建议尽可能使用java.time
。
但是,就此代码如何考虑DST而言,这是相关的一行:
int offSet = tz.getOffset(Calendar.getInstance().getTimeInMillis());
创建Calendar
毫无意义 - 这会更简单:
int offSet = tz.getOffset(System.currentTimeMillis());
他们都做同样的事情:从UTC获得当前偏移量。来自TimeZone.getOffset
:
当然,只适用于当前时间的 - 它可能在一分钟之前有所不同,并且在一分钟之内可能会有所不同。如果您刚刚格式化了当前日期/时间,则可能在格式化和此格式之间,时区偏移已更改。避免此代码的另一个原因。在指定日期返回此时区与UTC的偏移量。如果夏令时在指定日期生效,则使用夏令时量调整偏移值。