代码小结:时区的时间问题
import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.TimeZone; public class TimeZoneAndDate { /** * 如果虚拟机中得到的时间与机器的时间不同,那么基本上就是因为时区设置的原因。 * 当前默认的时区不为当地的时区就会出现时间偏差,这时我们可以更改默认时区,更改之后获得的时间就都为你所设置的时区的时间了。 * 注意:更改默认时区后的改变是全局的,也就是说只要当前服务没有关闭(比如:在web项目中服务器没关闭),以后获得的时间都会是之前设置的默认时区下的时间。 */ public static void fun1(){ System.out.println("当前默认的时区:"+TimeZone.getDefault()); System.out.println("默认时区下的当前时间:"+new Date()); // 更改当前时区为东八区GMT+8,即北京时间。 TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); System.out.println("更改后的时区:"+TimeZone.getDefault()); System.out.println("更改时区后的当前时间:"+new Date()); /** 以下为2012-12-22日的测试结果 */ // 当前默认的时区:sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] // 默认时区下的当前时间:Sat Dec 22 07:16:17 GMT 2012 // 更改后的时区:sun.util.calendar.ZoneInfo[id="GMT+08:00",offset=28800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] // 更改时区后的当前时间:Sat Dec 22 15:16:17 GMT+08:00 2012 } /** * 如果我们虚拟机的时区是正确的,但客户端可能不都在一个时区(比如一些跨国项目),我们中国也是横跨5个时区的, * 这种情况下我们就需要将当前时区下的时间转化成其他时区下的时间,这时我们不能使用全局的时区设置,而只能局部转化。 */ public static void fun2(){ Date date = new Date(); SimpleDateFormat sdf8 = new SimpleDateFormat(); sdf8.setTimeZone(TimeZone.getTimeZone("GMT+8"));//东八区,北京时间 SimpleDateFormat sdf9 = new SimpleDateFormat(); sdf9.setTimeZone(TimeZone.getTimeZone("GMT+9"));//东九区,日本时间 System.out.println(TimeZone.getDefault().getID()+"默认时区:"+date); System.out.println(sdf8.getTimeZone().getID()+"时区:"+sdf8.format(date)); System.out.println(sdf9.getTimeZone().getID()+"时区:"+sdf9.format(date)); /** 以下为2012-12-22的测试结果 。 * 前后显示时间的格式不同,SimpleDateFormat使用的是系统默认的格式。 * 我们也可以进行更改,如:new SimpleDateFormat("yyyy-MM-dd HH-mm-ss") * 补充:SimpleDateFormat还可以设置Locale。Locale主要还是与语言、文字有关,用于设置国际化 */ // GMT默认时区:Sat Dec 22 07:37:53 GMT 2012 // GMT+08:00时区:12-12-22 下午3:37 // GMT+09:00时区:12-12-22 下午4:37 } public static void main(String[] args) { // TODO Auto-generated method stub // fun1(); fun2(); } }