写在前面
日期处理在商业逻辑的应用中占据着很重要的地位,所以在这里进行一个总结。 具体就是一下几个类的理解和使用:
java.util.Date,
java.sql.Date,
java.util.Calendar,
java.util.GregorianCalendar
java.text.Format,
java.text.SimpleDateFormat
Date类和Calendar类的关系
java.util.Date 表示一个特定的瞬间,精确到毫秒。
在 JDK 1.1 之前,类 Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃。
java.util.Date
Date date = new Date();
System.out.println(date.getTime());
上面的代码首先创建了java.util.Date的一个实例,接着使用getTime方法获得当前的时间。输出后的结果是一串长整型的数字,这是系统根据当前时间计算出来的一个long型的数。
java.sql.Date
java.sql.Date 是针对SQL语句使用的,它只包含日期而没有时间部分
它有getTime方法返回毫秒数,自然就可以直接构建
java.util.Date d = new java.util.Date(sqlDate.getTime());
java.sql.Date date = new java.sql.Date(d.getTime());
后者之后在读写数据库的时候用他,因为PreparedStament的setDate()的第2参数和ResultSet的getDate()方法的第2个参数都是java.sql.Date
java.util.Date和java.sql.Date之间的转换:
sqlDate -> utilDate
java.sql.Date date = new Java.sql.Date();
java.util.Date d = new java.util.Date (date.getTime());
utilDate -> sqlDate
java.util.Date date = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
java.util.Date d = new java.util.Date (new Java.sql.Date());
Java.util.Calendar
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected。
与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();
java.util.GregorianCalendar
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL); GregorianCalendar cal = new GregorianCalendar(); cal.setTime(new Date()); System.out.println("System Date " + dateFormat.format(cal.getTime())); cal.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.FRIDAY); System.out.println("After Setting Day of Week to Friday: " +dateFormat.format(cal.getTime()));
使用Calendar的例子
import java.util.*; public class ShowDate { public static void main(String[] args) { Calendar calendar = new GregorianCalendar(); Date trialTime = new Date(); calendar.setTime(trialTime); // print out a bunch of interesting things System.out.println("ERA: " + calendar.get(Calendar.ERA)); System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR)); System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH)); System.out.println("DATE: " + calendar.get(Calendar.DATE)); System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH)); System.out .println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR)); System.out .println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); System.out .println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY)); System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); System.out .println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND)); System.out.println("ZONE_OFFSET: " + (calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000))); System.out.println("DST_OFFSET: " + (calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000))); System.out.println("Current Time, with hour reset to 3"); calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override calendar.set(Calendar.HOUR, 3); System.out.println("ERA: " + calendar.get(Calendar.ERA)); System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR)); System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH)); System.out.println("DATE: " + calendar.get(Calendar.DATE)); System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH)); System.out .println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR)); System.out .println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); System.out .println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY)); System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); System.out .println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND)); System.out.println("ZONE_OFFSET: " + (calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000))); // in System.out.println("DST_OFFSET: " + (calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000))); // in } }
java.text.DateFormat
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。其子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。
DateFormat 提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间 Formatter。格式化风格包括 FULL、LONG、MEDIUM 和 SHORT。方法描述中提供了使用这些风格的更多细节和示例。
DateFormat 可帮助进行格式化并解析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历),其代码可完全与语言环境的约定无关。
要格式化一个当前语言环境下的日期,可使用某个静态工厂方法:
myString = DateFormat.getDateInstance().format(myDate);
要格式化不同语言环境的日期,可在 getDateInstance() 的调用中指定它。
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);
还可使用 DateFormat 进行解析。
myDate = df.parse(myString);
java.text.SimpleDateFormat
定制日期格式
SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来创建日期-时间格式器。每一个这样的类方法都能够返回一个以默认格式模式初始化的日期/时间格式器。可以根据需要使用 applyPattern 方法来修改格式模式。有关使用这些方法的更多信息,请参阅 DateFormat。
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); java.util.Date utilDate = new Date(); java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); java.sql.Time sTime = new java.sql.Time(utilDate.getTime()); java.sql.Timestamp stp = new java.sql.Timestamp(utilDate.getTime());
这里所有时间日期都可以被SimpleDateFormat格式化format();
f.format(stp); f.format(sTime); f.format(sqlDate); f.format(utilDate);java.sql.Date sqlDate = java.sql.Date.valueOf("2005-12-12"); utilDate = new java.util.Date(sqlDate.getTime());
另类取得年月日的方法:
java.util.Date date = new java.util.Date(); //如果希望得到YYYYMMDD的格式 SimpleDateFormat sy1 = new SimpleDateFormat("yyyyMMDD"); String dateFormat = sy1.format(date); //如果希望分开得到年,月,日 SimpleDateFormat sy = new SimpleDateFormat("yyyy"); SimpleDateFormat sm = new SimpleDateFormat("MM"); SimpleDateFormat sd = new SimpleDateFormat("dd"); String syear = sy.format(date); String smon = sm.format(date); String sday = sd.format(date);
内建的日期格式
既然我们已经可以生成和解析定制的日期格式了, 让我们来看一看如何使用内建的格式化过程. 方法 DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过程. 在下面的例子中, 我们获取了四个内建的日期格式化过程. 它们包括一个短的, 中等的, 长的, 和完整的日期格式.
import java.text.DateFormat; import java.util.Date; public class DateExample4 { public static void main(String[] args) { Date date = new Date(); DateFormat shortDateFormat = DateFormat. getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT); DateFormat mediumDateFormat = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM); DateFormat longDateFormat = DateFormat. getDateTimeInstance( DateFormat.LONG, DateFormat.LONG); DateFormat fullDateFormat = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL); System.out.println(shortDateFormat.format(date)); System.out.println(mediumDateFormat.format(date)); System.out.println(longDateFormat.format(date)); System.out.println(fullDateFormat.format(date)); } }
在对 getDateTimeInstance的每次调用中都传递了两个值. 第一个参数是日期风格, 而第二个参数是时间风格. 它们都是基本数据类型int(整型). 考虑到可读性, 我们使用了DateFormat 类提供的常量: SHORT, MEDIUM, LONG, 和 FULL. 要知道获取时间和日期格式化过程的更多的方法和选项, 请看Sun 公司Web 站点上的解释.
运行我们的例子程序的时候, 它将向标准输出设备输出下面的内容:
9/29/01 8:44 PM
Sep 29, 2001 8:44:45 PM
September 29, 2001 8:44:45 PM EDT
Saturday, September 29, 2001 8:44:45 PM EDT
使用java.util.Calendar 格式化时间
Calendar cal = new GregorianCalendar(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH)+1; int day = cal.get(Calendar.DAY_OF_MONTH); int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); String week = ""; switch(dayOfWeek) { case 1: week = "星期天"; break; case 2: week = "星期一"; break; case 3: week = "星期二"; break; case 4: week = "星期三"; break; case 5: week = "星期四"; break; case 6: week = "星期五"; break; default: week = "星期六"; break; int hour = cal.get(Calendar.HOUR_OF_DAY); // 24小时制 // int hour = cal.get(Calendar.HOUR); // 12小时制 int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND); String h,m,s; if(hour<10) h = "0"+hour; else h = hour+""; if(minute<10) m = "0"+minute; else m = minute+""; if(second<10) s = "0"+second; else s = second+"";
在JSP中输出是:
今天是: 年
月 日 :结果: 今天是: 2006年4月14日星期五 05:35:26
在数据库中插入时间
PreparedStatement ps = con.prepareStatement("insert into TableName(dAddTime) values(?)");
1) ps.setDate(1,new java.sql.
Date (System. currentTimemillis ()));
2) ps.setTime(2,new java.sql.
Time (System. currentTimemillis ()));
3) ps.setTimestamp(3,new java.sql.
Timestamp (System. currentTimemillis ()));
你可以试验这三种不同方式的结果。