一.java中的時間
1.1.java中的時間使用標準類庫中的Date類來表示,使用距離一個固定時間點的毫秒數(可正、可負,類型爲long)表達的一個特定的時間點。
1.2.固定的時間點叫做紀元(Epoch)是UTC時間1970年1月1日00:00:00。即1970年元旦。
1.3.Date的每一個實例用於表示一個確切的時間點,其內部維護了一個long值,改值記錄的是1970年元旦到目前爲止經歷的毫秒數,由於Data設計上存在缺陷(時區、千年蟲),所以Date類的大部分方法被設置爲過時的方法,不在建議使用。所謂的時區問題就是對於不同的操作系統而言獲取時間的方式不同,像Linux系統獲取時間的方式是使用格林威治標準時間加上相對應的時區差來計算時間,但是對於Windows系統是直接獲取系統的時間,千年蟲問題就是一個進位問題,當數值超過某個數的時候就會發生錯誤。
1.4.使用默認的構造方法創建日期對象可以獲取當前系統的時間,Date中的大部分方法不建議使用,但是由於java向下兼容的特性,因此不建議使用的方法並沒有刪除,但是Date類內部維護的用於獲取long值的方法可以使用。
二.SimpleDateFormat(格式化時間)類的簡介:
2.1.該類屬於Java.text.SimpleDateFormat包中,其主要作用就是用於規定一個日期格式。
2.2常見的日期格式如下圖:
2.3SimpleDateFormat中提供的方法 String format(Date date)可以將一個日期對象轉換爲我們自定的格式。
package Day03;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
* java.text.SimpleDateFormat
* 根據一個給定的日期格式將String與Date相互轉換
*/
public class SimpleDateFormatDemo1 {
public static void main(String[] args) {
//當前系統時間
Date now=new Date();
System.out.println(now);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/*
* Date ->String
* String format(Date date)
* format方法可以將給定的date對象所表示時間按照SimapleDateFormat指定
* 的日期格式轉換爲字符串
*/
String str=sdf.format(now);
System.out.println(str);
}
}
2.4方法Date parse(String str)可以將一個字符串按照SimpleDateFormat給定的格式轉換爲日期對象。
package Day03;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
* 從字符串轉換爲date
* date parse(String str)
* 將給定的字符串按照SimpleDateFormat指定的日期格式解析爲
* 一個date 對象
*/
public class SimpleDateDormateDemo2 {
public static void main(String[] args) throws ParseException {
String str="2008-08-08 20:08:08";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=sdf.parse(str);
System.out.println(date);
}
}
三.Calendar類的簡介:
3.1.位於java.util.Calendar包中,用於封裝日曆信息,其主要作用在於該類提供的方法可以對日期的時間分量進行計算。
3.2.Calendar類是抽象類,其具體的子類針對於不同國家的日曆系統,常用的類是GergorianCalendar,即通用的陽曆。
3.3.該類不能創建實例,但是可以使用Calendar提供的靜態方法getInsatnce()方法來創建實例,該方法會根據當前系統所在的地區創建一個相應的實現,通常是GregorianCalendar,默認創建的日曆實例表示當前系統的時間。
3.4.由於Calendar類的toString方法不友好,即不能直觀的表示當前的時間,因此需要將Calendar對象和Date對象進行轉換,其中Calendar提供的getTime方法用於返回一個Date對象,該對象表示的時間就是Calendar對象表示的時間。
3.5.我們通常使用時間就是爲了對時間的進行操作,因此需要將一個Date對象轉換Calendar,Calendar類中提供的方法setTime(Date date)可以表示Date所表示的時間。
Date date=calendar.getTime();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));
date.setTime(date.getTime()+24*60*60*1000);
System.out.println(date);
calendar.setTime(date);
3.6.Calendar提供的set(int field,int value)方法可以針對不同的時間分量單獨設置值。第一個參數表示的是時間分量:例如:年,月,日等等,第二個參數爲相對應的時間分量,將要設置的值。具體的實現如下:
public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
System.out.println(calendar.getTime());
calendar.set(Calendar.YEAR, 2008);
System.out.println(calendar.getTime());
/*
* 設置月
* 月從0開始,0表示1
*/
calendar.set(Calendar.MONTH, 8);
System.out.println(calendar.getTime());
/*
* 設置日:
* 對應的時間分量常用的:
* DATE:月中天
* DATE_OF_MONTH:月中的天,與DATE一致
* DAY_OF_WEEK:週中的天,星期幾
* DAY_OF_YEAR:年中的天
*/
calendar.set(Calendar.DAY_OF_MONTH, 8);
System.out.println(calendar.getTime());
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 8);
calendar.set(Calendar.SECOND, 8);
System.out.println(calendar.getTime());
}
3.7.Calendar提供的方法get(時間分量)方法,可以用來獲取Calendar表示的具體的時間分量的值。
public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
/*
* int get(int field_)
* 獲取對應時間分量的值
*/
//獲取年
int year=calendar.get(Calendar.YEAR);
//獲取月
int month=calendar.get(Calendar.MONTH)+1;
//獲取日
int day=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year+"-"+month+"-"+day);
//獲取時
int hour=calendar.get(Calendar.HOUR_OF_DAY);
//獲取分
int mo=calendar.get(Calendar.MINUTE);
//獲取秒
int second=calendar.get(Calendar.SECOND);
System.out.println(hour+":"+mo+":"+second);
//獲取周內天
int dow=calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("周"+(dow==1?7:dow-1));
String []data= {"日","一","二","三","四","五","六"};
System.out.println("周"+(data[dow-1]));
//到今天位置已經過了多少天
int doy=calendar.get(Calendar.DAY_OF_YEAR);
System.out.println(year+"已經過了"+doy+"天");
}
3.7.Calendar類提供的getActualMaximum(int field)方法可以獲取對應的時間分量的最大值。
public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
//當月總共有多少天
int days=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int month=calendar.get(Calendar.MONTH)+1;
int year=calendar.get(Calendar.YEAR);
System.out.println(year+"年"+month+"月總共有"+days+"天");
//今年總共多少天
days=calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println(year+"年總共有"+days+"天");
}
3.8.Calendar提供的方法void add(int field,int number)可以對指定的時間分量增加某個具體的值,如果是負數,就減去對應的值。
/*
* 查看3年2個月1天以後的日期
*
*/
Calendar calendar=Calendar.getInstance();
//查看三年
calendar.add(Calendar.YEAR, 3);
System.out.println(calendar.getTime());
//查看兩個月之後
calendar.add(Calendar.MONTH, 2);
System.out.println(calendar.getTime());
//查看25天之後
calendar.add(Calendar.DAY_OF_YEAR ,25);
System.out.println(calendar.getTime());
//查看五小時之前
calendar.add(Calendar.HOUR_OF_DAY, -5);
System.out.println(calendar.getTime());
四.總計
Date類的對象通常表示當前系統的時間,但是由於設計存在缺陷,其中的大部分方法都不在使用,SimpleDateFormat類的主要的作用就是規定一個日期格式,使輸出的日期符合某種格式的要求,Calendar類的主要作用就是對日期分量進行操作的。