您的位置:首页 > 其它

时区转换Tips

2015-12-31 16:54 288 查看
闲的蛋疼,随便看看就好了。。。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1. cal.getTimeInMillis()-System.currentTimeMillis() = 0;
这两个值是一样的,表示距离UTC+0的绝对毫秒值。(即距离1970.1.1 00:00:000的毫秒值)

2.当需要进行时区转换时有两种方式
2.1 Calendar cal = Calendar.getInstance();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置时间的格式

cal.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); //设置时区为上海
long absMillSeconds = cal.getTimeInMillis();
//获得绝对时间,全世界一个值
sdf.setCalendar(cal); //注意:在Calendar中设置了时区后,要放到sdf中使其生效
String cur_time = sdf.format(new Date(absMillSeconds ));
//这里获得的时间,是根据在cal中设置的时区来生成的。

例如: 在cal中设置的时区为 GMT+9:00,得到的时间就应该是东九区当前的时间
在cal中设置的时区为
GMT+10:00,得到的时间就应该是东十区当前的时间

这里的重点是Calendar这个类要跟SimpleDateFormat这个类交互起来使用,使得时区转换生效。

2.2.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置时间的格式

TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo")); //利用TimeZone来设置时区
long t = System.currentTimeMillis();
//获得绝对时间
Date date = new Date(t); // 绝对时间转换成date,由于进行了TimeZone的设置,因此这里的date对绝对时间t进行了时区转换
注意两种情况:
1. sdf.format(date) 得到的时间跟sdf有关,此时得到的日期被sdf进行了转换,因此跟date无关了又,虽然在TimeZone中设置了默认时区,但是并不影响sdf要进行转换的时区。。。
2. date 本身的时间是根据 TimeZone.setDefault()方法一致的。
综上,要特别小心使用SimpleDateFormat对日期进行格式转换。

3.小心SimpleDateFormat对时区的影响

SimpleDateFormat有两种方法可以控制时区转换

setCalendar(Calendar cal) ---> 跟Calender设置的时区相关,其实Calendar设置了时区,只对Calendar自己有效,跟Date,SimpleDateFormat并没有什么关系。。。这时,如果SimpleDateFormat跟Calendar相关联,才使SimpleDateFormat在格式转换中用上了Calendar设置的时区

setTimeZone(TimeZone tz) ---> 跟TimeZone的时区相关 TimeZone类设置时区后,确实会影响Date值,但是如果你同时使用了SimpleDateFormat来对你的日期进行了格式转换,那时区就只跟SimpleDateFormat设置的时区相关了。。。。

4.注意Calendar 类中跟时区相关的方法

cal.getTime()方法返回的是Date,因此如果你通过TimeZone类设置了时区,会影响该函数。

cal.getTimeZone()只是获得了一个TimeZone对象,并且它的时区是根据当前系统一致的,如win7。
跟你在TimeZone类中设置的时区没有关系,如果想跟TimeZone类中设置的时区一致,可用cal.getTimeZone().getDefault()。

CodeSection-----------------------------------------------------------------------------------------------------------------------

当前系统默认的时区为"Asia/Shanghai"

public static void main(String[] args) {
// TODO Auto-generated method stub

Calendar cal = Calendar.getInstance();
long j = cal.getTimeInMillis();
SimpleDateFormat  sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//sdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
//TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"));
//cal.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
//sdf.setCalendar(cal);
System.out.println(TimeZone.getDefault().getID()+"---"+cal.getTime());
System.out.println(TimeZone.getDefault().getID()+"---"+new Date(j));
System.out.println(TimeZone.getDefault().getID()+"---"+sdf.format(new Date(j)));
System.out.println(cal.getTimeZone().getID()+"---"+sdf.format(new Date(j)));
System.out.println(cal.getTimeZone().getDefault().getID()+"---"+sdf.format(new Date(j)));
System.out.println(sdf.getTimeZone().getID()+"---"+sdf.format(new Date(j)));
}


代码复制下,然后自己试试就明白啦。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: