/** * 美国时间转中国时间 * @param
date * @param
oldZone * @param
newZone * @return
*/public static Date changeTimeZone(Date date
, TimeZone oldZone
, TimeZone newZone
) { //转换为当时的美国时值 SimpleDateFormat simpleDateFormat
= new SimpleDateFormat
("yyyy-MM-dd HH:mm:ss"); simpleDateFormat
.setTimeZone
(oldZone
); date
= strToDate
(simpleDateFormat
.format
(date
)); //转换为当时的中国时区的值 simpleDateFormat
.setTimeZone
(newZone
); date
= strToDate
(simpleDateFormat
.format
(date
)); return date
;}public static Date strToDate(String str
){ Calendar calendar
= Calendar.getInstance
(); int year
= Integer.parseInt
(str
.substring
(0, 4)); int month
= Integer.parseInt
(str
.substring
(5, 7)); int day
= Integer.parseInt
(str
.substring
(8, 10)); int hour
= Integer.parseInt
(str
.substring
(11, 13)); int minute
= Integer.parseInt
(str
.substring
(14, 16)); int second
= Integer.parseInt
(str
.substring
(17, 19)); calendar
.set
(Calendar.YEAR, year
); calendar
.set
(Calendar.MONTH, month
-1); calendar
.set
(Calendar.DAY_OF_MONTH, day
); calendar
.set
(Calendar.HOUR_OF_DAY, hour
); calendar
.set
(Calendar.MINUTE, minute
); calendar
.set
(Calendar.SECOND, second
); return calendar
.getTime
();}
关键原理:
时间和日历是两个不同的概念。
Date代表的是一个绝对时间,也就是说,不管你在哪个时区,Date都是一样的,都是从1970年1月1日0点0分GMT时间起,到目前这一刻的毫秒数。所以,你第一段代码和第二段代码里面,得到的date对象所代表的时间其实是一样的。
而日历是人们对绝对时间的一种描述方法,例如某年某月某日几时几分几秒,这,随着你当前所处的时区和地区而不同。
你在观察date对象的时候,你肯定没有去看它的毫秒数,而是先把毫秒数转换成一个日历。你没有写出你是怎么把date转换成日历的,但假如你是用默认的Date.toString()的话,那么,这是根据当前的默认时区来把毫秒数转换成日历的。因此,你在第一段代码里没有修改默认时区,得到的还是美国时间。而在第二段代码里,因为修改了默认时区,所以虽然绝对时间没有变化,但是你转换得到的日历不一样了。
其实,如果你是要获取当前时间,那么直接用new Date()就可以了,跟你先创建一个Calendar对象,再指定一个时区后获取的date是完全一样的。只有在你需要把一个date用日历来表示的时候,才需要用到Calendar和TimeZone。
一些总结:
calendar.setTimeZone():你在calendar对象里面set的日期(日历)是对于哪个时区来说的
calendar.getTime():你说说的这个日期(日历),从1970(标准时区的这个日期)到现在过了多少秒
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
simpleDateFormat.format(date):按照时区,来对时间戳进行日期(日历)格式化
转载请注明原文地址: https://ju.6miu.com/read-1125822.html