开发跨地域的程序时,常需要进行时区转换,一个设计优良的系统,也必须考虑对多时区的支持。JDK提供了很多方便的机制和工具,来帮助我们解决时区转换问题。
解决跨时区问题的关键在于时间的记录形式。若将时间单纯的记录成“2011-05-14 23:30:00”,其中蕴含的信息并不足以进行时区转换,因为无法获知这是中国的23点30,还是美国的23点30,更不用说复杂的夏令时问题了。
我们可以使用一个long类型的变量来记录时间,该变量的值等于从1970年1月1日 00:00:00 GMT到记录时间点以来的毫秒数,其中GMT代表格林威治标准时间,通过这个差值,可以获得记录时间点的格林威治(零时区)时间,进而能方便的转换成全世界各时区的时间。(很多数据库引擎就是如此处理时间类型数据)
在Java中,有两个常用方法来获取以上描述的值:
1. System.currentTimeMillis(),该方法的返回值是从1970年1月1日 00:00:00 GMT至当前时间点以来的毫秒数,通常被用来获取当前系统时间;
2. java.util.Date的getTime(),该方法的返回值是从1970年1月1日 00:00:00 GMT至Date对象所表示的时间点以来的毫秒数,通常被用来获取特定的时间。
此外,我们还需要借助java.util.TimeZone类,来获取特定的时区,JRE安装目录下的\lib\zi文件夹列出了所有TimeZoneID,如:Asia/Shanghai。最后,使用java.text.SimpleDateFormat类提供的方法进行转换,并格式化输出。
以下是两段示例代码:
1
//1. 将系统当前时间转换成美国东部时间
2
TimeZone timeZoneNY = TimeZone.getTimeZone(“America/New_York”);
3
SimpleDateFormat outputFormat = new SimpleDateFormat(“EEE MMM d HH:mm:ss Z yyyy”, Locale.US);
4
outputFormat.setTimeZone(timeZoneNY);
5
Date date = new Date(System.currentTimeMillis());
6
System.out.println(outputFormat.format(date));
01
//2. 将一个以字符串形式输入的北京时间转换成美国东部时间
02
String inputDate = “2011-05-14 23:30:00”;
03
TimeZone timeZoneSH = TimeZone.getTimeZone(“Asia/Shanghai”);
04
TimeZone timeZoneNY = TimeZone.getTimeZone(“America/New_York”);
05
SimpleDateFormat inputFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
06
inputFormat.setTimeZone(timeZoneSH);
07
Date date = null;
08
try
09
{
10
date = inputFormat.parse(inputDate);
11
}
12
catch (ParseException e)
13
{
14
}
15
16
SimpleDateFormat outputFormat = new SimpleDateFormat(“EEE MMM d HH:mm:ss Z yyyy”, Locale.US);
17
outputFormat.setTimeZone(timeZoneSH);
18
System.out.println(“Asia/Shanghai:” + outputFormat.format(date));
19
outputFormat.setTimeZone(timeZoneNY);
20
System.out.println(“America/New_York:” + outputFormat.format(date));