1. 程式人生 > >Java 日期的各種操作

Java 日期的各種操作

在Java中,操作日期主要涉及到一下幾個類: 1、java.util.Date         類 Date 表示特定的瞬間,精確到毫秒。從 JDK 1.1 開始,應該使用 Calendar 類實現日期和時間欄位之間轉換,使用 DateFormat 類來格式化和分析日期字串。Date 中的把日期解釋為年、月、日、小時、分鐘和秒值的方法已廢棄。 2、java.text.DateFormat(抽象類)         DateFormat 是日期/時間格式化子類的抽象類,它以與語言無關的方式格式化並分析日期或時間。日期/時間格式化子類(如 SimpleDateFormat)允許進行格式化(也就是日期 -> 文字)、分析(文字-> 日期)和標準化。將日期表示為 Date 物件,或者表示為從 GMT(格林尼治標準時間)1970 年,1 月 1 日 00:00:00 這一刻開始的毫秒數。 3、java.text.SimpleDateFormat(DateFormat的直接子類)
        SimpleDateFormat 是一個以與語言環境相關的方式來格式化和分析日期的具體類。它允許進行格式化(日期 -> 文字)、分析(文字 -> 日期)和規範化。         SimpleDateFormat 使得可以選擇任何使用者定義的日期-時間格式的模式。但是,仍然建議通過 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 來新的建立日期-時間格式化程式。 4、java.util.Calendar(抽象類)         Calendar 類是一個抽象類,它為特定瞬間與一組諸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日曆欄位之間的轉換提供了一些方法,併為操作日曆欄位(例如獲得下星期的日期)提供了一些方法。瞬間可用毫秒值來表示,它是距曆元(即格林威治標準時間 1970 年 1 月 1 日的 00:00:00.000,格里高利曆)的偏移量。         與其他語言環境敏感類一樣,Calendar 提供了一個類方法 getInstance,以獲得此型別的一個通用的物件。Calendar 的 getInstance 方法返回一個 Calendar 物件,其日曆欄位已由當前日期和時間初始化。 5、java.util.GregorianCalendar(Calendar的直接子類)
        GregorianCalendar 是 Calendar 的一個具體子類,提供了世界上大多數國家使用的標準日曆系統。         GregorianCalendar 是一種混合日曆,在單一間斷性的支援下同時支援儒略曆和格里高利曆系統,在預設情況下,它對應格里高利日曆創立時的格里高利曆日期(某些國家是在 1582 年 10 月 15 日創立,在其他國家要晚一些)。可由呼叫方通過呼叫 setGregorianChange() 來更改起始日期。 二、Java中的日期的格式化:

一般常用格式化類DateFormat和SimpleDateFormat的format(Date time)方法進行格式化日期.

一、Java中的日期概述

1. 首先介紹java.text.SimpleDateFormat類.

public class SimpleDateFormat 

SimpleDateFormat

是一個以與語言環境有關的方式來格式化和解析日期的具體類。它允許進行格式化(日期 -> 文字)、解析(文字 -> 日期)和規範化。 使得可以選擇任何使用者定義的日期-時間格式的模式。但是,仍然建議通過 DateFormat 中的 getTimeInstancegetDateInstancegetDateTimeInstance 來建立日期-時間格式器。每一個這樣的類方法都能夠返回一個以預設格式模式初始化的日期/時間格式器。可以根據需要使用applyPattern 方法來修改格式模式。 日期和時間模式

日期和時間格式由日期和時間模式 字串指定。在日期和時間模式字串中,未加引號的字母 'A''Z''a''z' 被解釋為模式字母,用來表示日期或時間字串元素。文字可以使用單引號 (') 引起來,以免進行解釋。"''" 表示單引號。所有其他字元均不解釋;只是在格式化時將它們簡單複製到輸出字串,或者在解析時與輸入字串進行匹配。

定義了以下模式字母(所有其他字元 'A''Z''a' 'z' 都被保留):

字母 日期或時間元素 表示 示例
G Era 標誌符 Text AD
y Year 1996; 96
M 年中的月份 Month July; Jul; 07
D 年中的天數 189
d 月份中的天數 10
E 星期中的天數 Text Tuesday; Tue
a Am/pm 標記 Text PM
H 一天中的小時數(0-23) 0
k 一天中的小時數(1-24) 24
K am/pm 中的小時數(0-11) 0
h am/pm 中的小時數(1-12) 12
m 小時中的分鐘數 30
s 分鐘中的秒數 55
z 時區 Pacific Standard Time; PST; GMT-08:00

示例

以下示例顯示瞭如何在美國語言環境中解釋日期和時間模式。給定的日期和時間為美國太平洋時區的本地時間 2001-07-04 12:08:56。
日期和時間模式 結果
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
/**
 * @author lyg
 * @Date 2015年12月27日上午10:45:36
 */
public class DateConstant {
	public final static String YEAR_MONTH_DAY="yyyy-MM-dd"; //年-月-日
	public final static String YEAR_MONTH_DAY__TIME="yyyy-MM-dd hh:mm:ss"; //年月日時分秒;
}

/**
 * 操作日期時間
 * 
 * @author lyg
 * @date 2015年12月27日
 */
public class DateUtil {
	public static void main(String[] args) {
		Date date=new Date();
		System.out.println(getDateFormat(DateConstant.YEAR_MONTH_DAY__TIME, date));
	}
	/**
	 * 返回日期字串格式
	 * 示例2015年12月27日
	 */
	public static String getDateFormatLong(Date date){
		DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.LONG);
		return dateFormat.format(date);
	}
	/**
	 * 返回日期字串格式
	 * 示例15-12-27
	 */
	public static String getDateFormatDefault(Date date){
		DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.DEFAULT);
		return dateFormat.format(date);
	}
	/**
	 * 返回日期字串格式
	 * 示例2015-12-27
	 */
	public static String getDateFormatShort(Date date){
		DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.SHORT);
		return dateFormat.format(date);
	}
	/**
	 * 返回日期字串格式
	 * 示例 
	 */
	public static String getDateFormat(String pattern,Date date){
		 SimpleDateFormat sFormat = new SimpleDateFormat(pattern);
		return sFormat.format(date);
	}
2.Java中的日期概述

Calendar 類是一個抽象類,它為特定瞬間與一組諸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日曆欄位之間的轉換提供了一些方法,併為操作日曆欄位(例如獲得下星期的日期)提供了一些方法。瞬間可用毫秒值來表示,它是距曆元(即格林威治標準時間 1970 年 1 月 1 日的 00:00:00.000,格里高利曆)的偏移量。 

常用的日期類有Calendar和GregorianCalendar,後者是前者的子類,並拓展了一些功能,例如是否為閏年等方法.兩者用法基本類似

public static void main(String[] args) {
		Date date=new Date();
		Calendar cal = Calendar.getInstance();// 取當前日期。
		System.out.println(getDateFormat(DateConstant.YEAR_MONTH_DAY__TIME, cal.getTime()));
	}
/**
	 * return Date
	 * 操作日期 param1 參入的日期,parem2 操作符號 param 3增加的天數
	 */
	public static Date addDateFormat(Calendar cal,String flag,Integer day){
		if("+".equals(flag)){
			cal.add(Calendar.DAY_OF_MONTH, day);
			return cal.getTime();
		}
		if("-".equals(flag)){
			cal.add(Calendar.DAY_OF_MONTH, -day);
			return cal.getTime();
		}
		return cal.getTime();
	}
面試題:

下面整理幾個有關於日期和時間操作的一些面試題;

獲取當前月份的最大天數

Calendar cal = Calendar.getInstance();   
int day=cal.getActualMaximum(Calendar.DAY_OF_MONTH);   
System.out.println(day); 

取當月的最後一天

Calendar cal = Calendar.getInstance();   
int maxDay=cals.getActualMaximum(Calendar.DAY_OF_MONTH);   
java.text.Format formatter3=new java.text.SimpleDateFormat("yyyy-MM-"+maxDay);   
System.out.println(formatter3.format(cal.getTime()));

取當月的第一天

java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-01");   
java.util.Date firstDay=new java.util.Date();   
System.out.println("the month first day is "+formats.format(firstDay)); 

求兩個日期之間相隔的天數

java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");   
java.util.Date beginDate= format.parse("2007-12-24");   
java.util.Date endDate= format.parse("2007-12-25");   
long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);   
System.out.println("相隔的天數="+day); 

一年前的日期

java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");   
java.util.Date todayDate=new java.util.Date();   
long beforeTime=(todayDate.getTime()/1000)-60*60*24*365;   
todayDate.setTime(beforeTime*1000);   
String beforeDate=formatter.format(todayDate);   
System.out.println(beforeDate);

一年後的日期

java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");   
java.util.Date todayDate=new java.util.Date();   
long afterTime=(todayDate.getTime()/1000)+60*60*24*365;   
todayDate.setTime(afterTime*1000);   
String afterDate=formatter.format(todayDate);   
System.out.println(afterDate);  

10小時後的時間 

java.util.Calendar Cal=java.util.Calendar.getInstance();   
Cal.setTime(dateOper);   
Cal.add(java.util.Calendar.HOUR_OF_DAY,10);   
System.out.println("date:"+forma.format(Cal.getTime()));  

10小時前的時間 

java.util.Calendar Cal=java.util.Calendar.getInstance();   
Cal.setTime(dateOper);   
Cal.add(java.util.Calendar.HOUR_OF_DAY,-10);   
System.out.println("date:"+forma.format(Cal.getTime()));  

當前日期的星期一和星期天

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
GregorianCalendar cal = new GregorianCalendar();


int dayInWeek = cal.get(Calendar.DAY_OF_WEEK);
int offset = 0;
if (dayInWeek == 1) {
    // 星期天
    offset = 6;
} else {
    // 星期一至星期六
    offset = dayInWeek - 2;
}
cal.add(GregorianCalendar.DAY_OF_MONTH, -offset);
String sday = dateFormat.format(cal.getTime());
cal.add(GregorianCalendar.DAY_OF_MONTH, 6);
String eday = dateFormat.format(cal.getTime());

System.out.println("這個星期的星期一:" + sday);
System.out.println("這個星期的星期天:" + eday);

獲取當前日期所在的星期屬於今年的第幾周

GregorianCalendar cal = new GregorianCalendar();
int weekOfYear = cal.get(Calendar.WEEK_OF_YEAR);
System.out.println("這個星期屬於第幾周:" + weekOfYear);
總結 Java中日期的經常有一下五個方面: 1、建立日期 2、日期格式化顯示 3、日期的轉換(主要是和字串之間的相互轉換) 4、日期中年、月、日、時、分、秒、星期、月份等獲取。 5、日期的大小比較、日期的加減。