java2平台为咱们提供了丰富的日期时间API。如java.util.Date;java.util.calendar;java.text.DateFormat等。那么它们之间有什么关系呢?java
首先,java.util.Date表明一个时间点,其值为距公元1970年1月1日 00:00:00的毫秒数。因此它是没有时区和Locale概念的。java经过以下形式取得当前时间点:数据库
Date now = new Date(); //这个时间点与本地系统的时区无关工具
而 正由于其与时区的无关性,才使得咱们的存储数据(时间)是一致的(时区一致性)。通常的咱们将now存储于数据库中,当咱们须要展示数据时,将 now格式化成想要的格式,如:2011-11-19 14:12:23。而这个功能通常交由java.text.DateFormat来实现。例如:spa
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String snow = sdf.format(now); // 2011-11-19 14:12:23
咱们发现snow是带时间(14:12:23)的字符串,咱们不由要问,该时间(14:12:23)是哪一个时区的时间?默认状况 下,SimpleDateFormat 取得本地系统的时区(个人时区为GMT+8北京),而后按照pattern("yyyy-MM-dd HH:mm:ss")格式化now,此时输出的就是GMT+8区的时间了。若是想支持国际化时间,则先指定时区,而后再格式化date数据。例如:code
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String snow = sdf.format(now); // 2011-11-19 14:12:23
另外,你能够经过以下代码修改本地时区信息:orm
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
java.util.Calendar类也表明时间点,但它为Date的facade工具类,提供了不少对时间点到年、月、日、时、分、秒、星期等的转换(计算)的方便方法。blog
Calendar calendar = Calendar.getInstance(timezone);
Date d = calendar.getTime();
Calendar 的计算也是基于时区的,例如:同一个date在不一样时区下的小时数是不同的。可是calendar.getTime();返回的date是没有时区的,由于它是Date类型的。例如:字符串
public static void main(String[] args) throws InterruptedException {
Calendar calendar1 = Calendar
.getInstance(TimeZone.getTimeZone("GMT+8"));
Calendar calendar2 = Calendar
.getInstance(TimeZone.getTimeZone("GMT+1"));
System.out.println("Millis = " + calendar1.getTimeInMillis());
System.out.println("Millis = " + calendar2.getTimeInMillis());
System.out.println("hour = " + calendar1.get(Calendar.HOUR));
System.out.println("hour = " + calendar2.get(Calendar.HOUR));
System.out.println("date = " + calendar1.getTime());
System.out.println("date = " + calendar2.getTime());
}
输出:get
Millis = 1358614681203 Millis = 1358614681203 hour = 3 hour = 8 date = Thu Nov 19 15:11:21 CST 2011 date = Thu Nov 19 15:11:21 CST 2011