一、Data及其常用API
1、簡介
Java中的時間使用標準類庫的java.util.Date,其表示特定的瞬間,精確到毫秒。是用距離一個固定時間點的毫秒數(可正可負,long類型)表達一個特定的時間點。
固定的時間點叫紀元(epoch),是UTC時間1970年 1月 1日 00:00:00 ,UTC(Universal Time Coordinated世界調整時間)與GMT(Greenwich Mean Time格林威治時間)一樣,是一種具有實際目的的科學標準時間。
因爲Date的設計具有"千年蟲"以及"時區"的問題,所以Date中的大部分方法已經不建議使用了,它們都被java.util.Calendar類所取代,該類我們稍後會講解。
2、構造函數
①:new Date() :返回系統當前時間的Date對象
②:new Date(long date):給定指定毫秒數,返回Date對象
③:new Date(int year, int month,int date) :根據年月日返回Date對象
注意:year:107表示2007年 年份=1900+year 。例如要表示2015年,則year=2015-1900=115
month:0表示1月 月份=month+1 。例如要表示6月,則month=6-1=5 。如果月份大於11會產生向年份進位。
date:日如果大於該月的最大值時,同樣會向月進位
④:new Date(int year,int month,int date,int hrs,int min)
⑤:new Date(int year,int month,int date,int hrs,int min,int sec)
注意:時分秒同樣也會產生進位
3、常用方法
①:setTime(long time) 設置一個時間,long表示的這個時間點距離1970年1月1日 00:00:00之間的毫秒差。
②:getTime():獲取該時間距離1970年1月1日 00:00:00之間的毫秒差
二、SimpleDateFormat
1、簡介
SimpleDateFormat 是一個以與語言環境有關的方式來格式化和解析日期的具體類。它允許進行格式化(日期 -> 文本)、解析(文本 -> 日期)和規範化。
2、日期模式匹配字符串
字符 | 含義 | 示例 |
y | 年 | yyyy年---2015年 |
M | 月 | MM月--03月 |
d | 日 | dd日--12日 |
E | 星期 | E--星期日 |
a | 上下午 | a--上午(AM) |
H | 24小時制 | HH時--16時 |
h | 12小時制 | hh時--04時 |
m | 分 | mm--23分 |
s | 秒 | ss--59秒 |
S | 毫秒 | SSS毫秒-567毫秒 |
例如yyyy-MM-dd HH:mm:ss.SSS可以匹配2015-06-02 14:32:13.546
3、將Date轉換成String
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println(sdf.format(date));
4、將String轉換成Date
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date =sdf.parse("2015-06-02 14:35:36.000");
System.out.println(date);
三、Calendar類
1、簡介
java.util.Calendar 類用於封裝日曆信息,其主要作用在於其方法可以對時間分量進行運算。
Calendar是抽象類,其具體子類針對不同國家的日曆系統,其中應用最廣泛的是GregorianCalendar(格里高裏歷,即通用的陽曆),對應世界上絕大多數國家/地區使用的標準日曆系統。
2、 getInstance()方法
Calendar是抽象類,其提供了一個工廠方法:Calendar getInstance()。該方法可以根據當前系統所在地區獲取一個適當的Calendar的子類實現。
在實際開發中,也推薦使用該方法來實例化Calendar的對象。
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Calendar calendar=Calendar.getInstance();
System.out.println(sdf.format(calendar.getTime()));
3、設置日期及時間分量
Calendar提供了一種通用的設置時間的方式:
void set(int field,int value)
該方法可以通過對不同的時間分量分別設置不同的值。Calendar對不同的時間分量提供了相應的常量,我們在使用set方法設置時,第一個參數就應當使用對應的常量作爲時間分量。
注意:分量month同樣從0開始,分量也有進位的可能
4、setTime與getTime
設置和獲取的對象都是Data類型,而Date對象對應的這兩個方法,是long類型的
5、void add(int field,int amount)
該方法可以爲某個時間分量的值加上給定的值,若想減去給定的值,那麼傳入的值需要時負數即可。並且計算後會自動進行相應的進位。
6、int getActualMaximum(int field)
獲取該分量的最大值
四、sql包下的時間類
爲什麼要有java.sql.Date這個類呢?
我們發現除了父類Date在util包下,它的三個子類都是在sql包下的。因爲在和數據庫打交道時(也就是在執行sql語句時),我們要用到sql包下的時間類,其他情況下我們通常用util包下的Date來格式化日期或者得到當前時間。爲什麼和數據庫打交道時不能用java.util.Date?因爲PreparedStatement有三個設置時間的方法:setDate()、setTime()、setTimeStamp(),這三個方法的第二個參數分別是java.sql.Date、java.sql.Time和java.sql.TimeStamp,並沒有提供參數是java.util.Date的方法。除此之外,ResultSet也有三個get()方法與之對應,且返回的時間類型也是sql包下的這三個類。
java.sql.Date日期格式爲:年月日
java.sql.Time日期格式爲:時分秒
java.sql.Timestamp日期格式爲:年月日時分秒納秒(毫微秒)
java.sql.Date類
(1)getTime方法返回毫秒數
(2)互相轉換
new java.sql.Date(new java.util.Date().getTime())
new java.util.Date(new java.sql.Date(0).getTime())
五、利用以上各個類的功能,我們可以很簡單的實現一些時間計算的功能,下面看幾個方法:
l、判斷是否是閏年
/**
* 給定一個年份判斷該年份是否爲閏年
*/
public static boolean isLeapYear(int year) {
GregorianCalendar calendar = new GregorianCalendar();
return calendar.isLeapYear(year);
}
2、獲取當前日期的字符串表示形式
/**
* 利用SimpleDateFormat獲取當前日期的字符串表示形式 格式:2009-5-05
*/
public static String getCurrentDate() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return dateFormat.format(System.currentTimeMillis());
}
3、給出任意一個年月日得到該天是星期幾
/**
* 給出任意一個年月日得到該天是星期幾
*/
public static int getWeek(String date) {
// 注意參數的大小寫格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
try {
Date d = dateFormat.parse(date);
c.setTime(d);
} catch (ParseException e) {
}
return c.get(Calendar.DAY_OF_WEEK)-1;
}
4、 獲得今天n天以後或者n天以前是那一天
/**
* 獲得距離今天n天的那一天的日期
*/
public static String getDistanceDay(int day) {
Calendar calen = Calendar.getInstance();
calen.add(Calendar.DAY_OF_MONTH, day);
Date date = calen.getTime();
// 這裏也個用SimpleDateFormat的format()進行格式化,然後以字符串形式返回格式化後的date
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return dateFormat.format(date);
}
5、 獲得距離指定日期n天的那一天的日期
/**
* 獲得距離指定日期n天的那一天的日期
*/
public static String getDistanceDay(String date, int day) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date d;
Calendar c =Calendar.getInstance();
try {
d = dateFormat.parse(date);
c.setTime(d);
c.add(Calendar.DATE, day);
} catch (ParseException e) {
e.printStackTrace();
}
return dateFormat.format(c.getTime());
}
6、獲得給定兩個日期相差的天數
/**
* 獲得給定兩個日期相差的天數
*
*/
public static long getGapDays(String date1, String date2) {
String[] d1 = date1.split("-");
String[] d2 = date2.split("-");
Calendar c = Calendar.getInstance();
c.set(Integer.parseInt(d1[0]), Integer.parseInt(d1[1]), Integer
.parseInt(d1[2]), 0, 0, 0);
long l1 = c.getTimeInMillis();
c.set(Integer.parseInt(d2[0]), Integer.parseInt(d2[1]), Integer
.parseInt(d2[2]), 0, 0, 0);
long l2 = c.getTimeInMillis();
return (Math.abs(l1 - l2) / (24 * 60 * 60 * 1000));
}