时区转换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"
代码复制下,然后自己试试就明白啦。。。。。。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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))); }
代码复制下,然后自己试试就明白啦。。。。。。
相关文章推荐
- 2015年自我总结
- cgi
- Java设计模式透析之 —— 适配器(Adapter)
- automake使用方法
- $each 遍历json字符串
- iOS 真机调试 出现process launch failed: timed out waiting for app to launch 和 failed to get the task for 的
- java 时间解析
- 导出Excel工具类
- AsyncTask原理精简版
- MesaSQLite数据库简单使用
- FragmentTransition replace add show hide方法的使用和差异
- CodeForces 466A Cheap Travel
- GTK+重拾--10 GTK+中的组件(二)
- 量化派重磅推出"量化派开放平台"
- git账户中如何添加SSHkeys
- 把电脑虚拟机linux下编译的程序烧写到ARM9开发板的linux系统里面的具体操作步骤
- 关于在ios7之后改变状态栏颜色
- python 解析xml 文件: Element Tree 方式
- 基于python的Tkinter实现一个简易计算器
- Android中AsyncTask的使用方法解析