今天遇到了一个很奇怪的问题,就是利用获取系统当前时间的时候,总是与实际的时间相差8个小时,十分郁闷。
无论是使用
Calendar c=Calendar.getInstance();
SimpleDateFormat f=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println(f.format(c.getTime()));
还是使用
String pattern = "yyyy-MM-DD HH:mm:ss";
SimpleDateFormat df = new SimpleDateFormat(pattern);
Date today = new Date();
System.out.println(df.format(today));
获得的时间都是与windows系统的时间相差8个小时,后来通过查阅相关资料,是由于我在获取时间的时候没有指定时区,于是设置了一下,哈哈,终于解决了!
解决方法有两个,分别是:
方法一:
public String getFormatedDateString(int timeZoneOffset)
if (timeZoneOffset > 13 || timeZoneOffset < -12) {
timeZoneOffset = 0;
}
TimeZone timeZone;
String[] ids = TimeZone.getAvailableIDs(timeZoneOffset * 60 * 60 * 1000);
if (ids.length == 0) {
// if no ids were returned, something is wrong. use default TimeZone
timeZone = TimeZone.getDefault();
} else {
timeZone = new SimpleTimeZone(timeZoneOffset * 60 * 60 * 1000, ids[0]);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(timeZone);
return sdf.format(newDate);
}
方法中参数timeZoneOffset表示时区,如中国一般使用东八区,因此timeZoneOffset就是8,如果是西四区就是传入-4就可以了!
方法二:
public String getFormatedDateString(){
java.util.TimeZone timeZone = java.util.TimeZone.getTimeZone("Asia/Shanghai");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
sdf.setTimeZone(timeZone);
return sdf.format(new Date());
}
此方法返回的是中国的北京时间,如果是其它国家的时间可以在TimeZone的getTimeZone方法中设置不同的时区,如:
TimeZone tzCN = TimeZone.getDefault();
TimeZone.getTimeZone("Asia/Shanghai");
TimeZone tzJP = TimeZone.getTimeZone("Japan");
TimeZone tzES = TimeZone.getTimeZone("Europe/Madrid");
TimeZone tzES2 = TimeZone.getTimeZone("GMT+1:00");
http://hi.baidu.com/flingsnow0907/blog/item/6ed2ee885aca9091a5c272f6.html
以下是我的解决办法:
- timeZone_digital = new Date();.getTimezoneOffset(); 得到时区时间差值
-
- 以上是JS得到的
- public static TimeZone getTimeZone(String timeZone_digital); {
- String gmt = "";
- if (timeZone_digital != null); {
- int length = timeZone_digital.length();;
- String d = "";
- String f = "";
- if (length == 1); {
- gmt = "GMT";
- } else if (timeZone_digital.startsWith("-");); {
- d = timeZone_digital.substring(0, 1);;
- f = timeZone_digital.substring(1, length);;
- gmt = "GMT+" + Integer.parseInt(f); / 60;
- } else {
- gmt = "GMT-" + Integer.parseInt(timeZone_digital); / 60;
- }
-
- } else {
-
- return TimeZone.getTimeZone("GMT+8");;
- }
-
- return TimeZone.getTimeZone(gmt);;
- }
timeZone_digital = new Date();.getTimezoneOffset(); 得到时区时间差值
以上是JS得到的
public static TimeZone getTimeZone(String timeZone_digital); {
String gmt = "";
if (timeZone_digital != null); {
int length = timeZone_digital.length();;
String d = "";
String f = "";
if (length == 1); {
gmt = "GMT";
} else if (timeZone_digital.startsWith("-");); {
d = timeZone_digital.substring(0, 1);;
f = timeZone_digital.substring(1, length);;
gmt = "GMT+" + Integer.parseInt(f); / 60;
} else {
gmt = "GMT-" + Integer.parseInt(timeZone_digital); / 60;
}
} else {
// 北京时区
return TimeZone.getTimeZone("GMT+8");;
}
return TimeZone.getTimeZone(gmt);;
}
这样就得到时区 TimeZone 了
接下就好办了
用
Locale default_locale = Locale.SIMPLIFIED_CHINESE;
SimpleDateFormat cnF = new SimpleDateFormat( "yyyy-mm-dd hh:mm", default_locale);
就可以任意转了
http://www.javaeye.com/topic/13720
造成这种问题的原因可能是:你的操作系统时区跟你JVM的时区不一致。
你的操作系统应该是中国的时区吧,而JVM的时区不一定是中国时区,你在应用服务器的Java虚拟机添加如下配置:
-Dfile.encoding=UTF8 -Duser.timezone=GMT+08 [博主评:这招比较方便又管用]