版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011798638/article/details/84244039
示例
分享一个获取指定时区的时间格式方法:timeZoneOffset指定为8,获取东8区的时间,timeZoneOffset指定为-5,获取西5区的时间。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
public class TimeZoneTest {
public static String getFormatedDateString(int timeZoneOffset) {
if (timeZoneOffset > 14 || timeZoneOffset < -12) {
System.out.println("Configuration item TimeZone " + timeZoneOffset + " is invalid.");
timeZoneOffset = 0;
}
TimeZone timeZone;
String[] ids = TimeZone.getAvailableIDs(timeZoneOffset * 60 * 60 * 1000);
if (ids.length == 0) {
// Use default TimeZone
timeZone = TimeZone.getDefault();
} else {
timeZone = new SimpleTimeZone(timeZoneOffset * 60 * 60 * 1000, ids[0]);
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(timeZone);
return simpleDateFormat.format(new Date());
}
public static void main(String[] args) {
String test = getFormatedDateString(8);
System.out.println(test);
System.out.println(getFormatedDateString(-5));
}
}
问题
时区名
同一个时区存在多个不同的国家、城市,不同城市会用不同的夏令时时间,所以上面的示例只是获取时区ID列表的第一个代表,可能出现夏令时错误。更精确的方式是指定精确的时区名。比如:悉尼和布里斯班,都是东10区,但是悉尼实行夏令时,所以夏天的时候,悉尼要比布里斯班早1小时。
TimeZone timeZoneSYD = TimeZone.getTimeZone("Australia/Sydney");
TimeZone timeZoneBNE = TimeZone.getTimeZone("Australia/Brisbane");
时区精度
上述例子中整数表示时区,大部分情况下是没有问题的,有些地区时区是存在半点时区。比如:GMT+05:30 印度标准时间(Indian Standard Time 缩写IST)
参考时区
KLT +14:00 基里巴斯线岛时间
NZDT +13:00 新西兰夏时制
IDLW +12:00 国际日期变更线,西边
NZST +12:00 新西兰标准时间
NZT +12:00 新西兰时间
CCT +08:00 中国北京时间(俄罗斯伊尔库茨克时区)
WST +08:00 西澳大利亚标准时间
GMT 0:00 格林尼治标准时间
UT +00:00 全球时间
UTC +00:00 校准的全球时间
EDT -04:00 东部夏时制
CDT -05:00 中部夏时制
EST -05:00 东部标准时间
CST -06:00 中部标准时间
CAT -10:00 中阿拉斯加时间
NT -11:00 阿拉斯加诺姆时间
IDLE -12:00 国际日期变更线,东边