【Java SE基础】日期处理


写在前面


日期处理在商业逻辑的应用中占据着很重要的地位,所以在这里行一个总结。 具体就是一下几个类的理解和使用: 


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());

后者之后在读写数据库的时候用他,因为PreparedStamentsetDate()的第2参数和ResultSetgetDate()方法的第2个参数都是java.sql.Date 


java.util.Datejava.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 类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 月 日的 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。格式化风格包括 FULLLONGMEDIUM 和 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 中的 getTimeInstancegetDateInstance 或 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中输出是:

今天是

    日 :

结果: 今天是: 2006414日星期五 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 ())); 

你可以试验这三种不同方式的结果。



你可能感兴趣的:(【Java SE基础】日期处理)