1、首先什么是时区?
时区(Time Zone)是地球上的区域使用同一个时间定义。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。
2、Date
TimeZone对象给我们的是原始的偏移量,也就是与GMT相差的微秒数,Java的Date对象里面存储着当前时刻到1970年1月1日0:00所经过的毫秒数,它与时区和地域没有关系(其实可以认为是GMT时间)
计算机内部记录的时间(Date date = new Date()), 为格林威治标准时(GMT). 即java.util.Date代表一个时间点,其值为距公元1970年1月1日 00:00:00的毫秒数,所以它可以认为是没有时区和Locale概念的。
3、DateFormat
日期格式化类DateFormat, 对于不同地区的配置一般有两个点, 一个是Locale , 一个是TimeZone
前者(Locale)使DateFormat按所配置的地区特性来输出文字(例如中国,美国,法国不同地区对日期的表示格式不一样,中国可能是2001年10月5日)
后者(TimeZone)让DateFormat知道怎么去转换,去调整时间偏移度,从而得到符合配置的时区的时间.
假设当前时区为GMT+0,取得当前时间为2:00, 那么如果你配置DateFormat.setTimeZome("GMT+8"), 即北京时间的时区, 那么这时候格式化输出的就是10:00了, 因为系统对原始毫秒数进行了时间偏移调整(调到你设置的时区),即加多8小时,之后再格式化输出日期的字符串形式
4、代码事例
import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimeZone; import java.util.Date; public class Test { public static void main(String[] args) { //TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); //TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris")); //注意这行下面的代码要取消注释 TimeZone time = TimeZone.getDefault();// 这个是国际化所用的 System.out.println(time); Calendar calendar = Calendar.getInstance();// 获取实例 DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 构造格式化模板 Date date = calendar.getTime(); // 获取Date对象 String str = new String(); str = format1.format(date);// 对象进行格式化,获取字符串格式的输出 System.out.println(str); } }
输出的结果是:
sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null] 2015-07-03 22:27:14
如果将注释Europe/Paris这行打开,那么运行的结果是:
sun.util.calendar.ZoneInfo[id="Europe/Paris",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=184,lastRule=java.util.SimpleTimeZone[id=Europe/Paris,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]] 2015-07-03 16:30:49
说明使用TimeZone.setDefault方法可以调整显示的时区
时间: 2024-11-05 18:32:11