Java 日期的各種操作
阿新 • • 發佈:2019-02-08
在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中的日期的格式化:
一、Java中的日期概述
一般常用格式化類DateFormat和SimpleDateFormat的format(Date time)方法進行格式化日期.
1. 首先介紹java.text.SimpleDateFormat類.
2.Java中的日期概述public class SimpleDateFormat是一個以與語言環境有關的方式來格式化和解析日期的具體類。它允許進行格式化(日期 -> 文字)、解析(文字 -> 日期)和規範化。 使得可以選擇任何使用者定義的日期-時間格式的模式。但是,仍然建議通過
SimpleDateFormat
DateFormat
中的getTimeInstance
、getDateInstance
或getDateTimeInstance
來建立日期-時間格式器。每一個這樣的類方法都能夠返回一個以預設格式模式初始化的日期/時間格式器。可以根據需要使用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); }
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、日期的大小比較、日期的加減。