Java 日期時(shí)間

2022-11-11 17:04 更新

java.util包提供了Date類來封裝當(dāng)前的日期和時(shí)間。 Date類提供兩個(gè)構(gòu)造函數(shù)來實(shí)例化Date對象。

第一個(gè)構(gòu)造函數(shù)使用當(dāng)前日期和時(shí)間來初始化對象。

Date( )

第二個(gè)構(gòu)造函數(shù)接收一個(gè)參數(shù),該參數(shù)是從1970年1月1日起的毫秒數(shù)。

Date(long millisec)

Date對象創(chuàng)建以后,可以調(diào)用下面的方法。

序號 方法和描述
1 boolean after(Date date)
若當(dāng)調(diào)用此方法的Date對象在指定日期之后返回true,否則返回false。
2 boolean before(Date date)
若當(dāng)調(diào)用此方法的Date對象在指定日期之前返回true,否則返回false。
3 Object clone( )
返回此對象的副本。
4 int compareTo(Date date)
比較當(dāng)調(diào)用此方法的Date對象和指定日期。兩者相等時(shí)候返回0。調(diào)用對象在指定日期之前則返回負(fù)數(shù)。調(diào)用對象在指定日期之后則返回正數(shù)。
5 int compareTo(Object obj)
若obj是Date類型則操作等同于compareTo(Date) 。否則它拋出ClassCastException。
6 boolean equals(Object date)
當(dāng)調(diào)用此方法的Date對象和指定日期相等時(shí)候返回true,否則返回false。
7 long getTime( )
返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數(shù)。
8 int hashCode( )
 返回此對象的哈希碼值。
9 void setTime(long time)
 
用自1970年1月1日00:00:00 GMT以后time毫秒數(shù)設(shè)置時(shí)間和日期。
10 String toString( )
轉(zhuǎn)換Date對象為String表示形式,并返回該字符串。

獲取當(dāng)前日期時(shí)間

Java中獲取當(dāng)前日期和時(shí)間很簡單,使用Date對象的 toString()方法來打印當(dāng)前日期和時(shí)間,如下所示:

import java.util.Date;
  
public class Main{
   public static void main(String args[]) {
       // 初始化 Date 對象
       Date date = new Date();
        
       // 使用 toString() 函數(shù)顯示日期時(shí)間
       System.out.println(date.toString());
   }
}

以上實(shí)例編譯運(yùn)行結(jié)果如下:

Mon May 04 09:51:52 CDT 2013

日期比較

Java使用以下三種方法來比較兩個(gè)日期:

  • 使用getTime( ) 方法獲取兩個(gè)日期(自1970年1月1日經(jīng)歷的毫秒數(shù)值),然后比較這兩個(gè)值。
  • 使用方法before(),after()和equals()。例如,一個(gè)月的12號比18號早,則new Date(99, 2, 12).before(new Date (99, 2, 18))返回true。
  • 使用compareTo()方法,它是由Comparable接口定義的,Date類實(shí)現(xiàn)了這個(gè)接口。

使用SimpleDateFormat格式化日期

SimpleDateFormat是一個(gè)以語言環(huán)境敏感的方式來格式化和分析日期的類。SimpleDateFormat允許你選擇任何用戶自定義日期時(shí)間格式來運(yùn)行。例如:

import java.util.*;
import java.text.*;

public class Main{
   public static void main(String args[]) {

      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

      System.out.println("Current Date: " + ft.format(dNow));
   }
}

以上實(shí)例編譯運(yùn)行結(jié)果如下:

Current Date: Sun 2004.07.18 at 04:14:09 PM PDT

簡單的DateFormat格式化編碼

時(shí)間模式字符串用來指定時(shí)間格式。在此模式中,所有的ASCII字母被保留為模式字母,定義如下:

字母 描述 示例
G 紀(jì)元標(biāo)記 AD
y 四位年份 2001
M 月份 July or 07
d 一個(gè)月的日期 10
h  A.M./P.M. (1~12)格式小時(shí) 12
H 一天中的小時(shí) (0~23) 22
m 分鐘數(shù) 30
s 秒數(shù) 55
S 毫秒數(shù) 234
E 星期幾 Tuesday
D 一年中的日子 360
F 一個(gè)月中第幾周的周幾 2 (second Wed. in July)
w 一年中第幾周 40
W 一個(gè)月中第幾周 1
a A.M./P.M. 標(biāo)記 PM
k 一天中的小時(shí)(1~24) 24
K  A.M./P.M. (0~11)格式小時(shí) 10
z 時(shí)區(qū) Eastern Standard Time
' 文字定界符 Delimiter
" 單引號 `

使用printf格式化日期

printf方法可以很輕松地格式化時(shí)間和日期。使用兩個(gè)字母格式,它以t開頭并且以下面表格中的一個(gè)字母結(jié)尾。例如:

import java.util.Date;

public class Main{

  public static void main(String args[]) {
     // 初始化 Date 對象
     Date date = new Date();

     // 使用toString()顯示日期和時(shí)間
     String str = String.format("Current Date/Time : %tc", date );

     System.out.printf(str);
  }
}

以上實(shí)例編譯運(yùn)行結(jié)果如下:

Current Date/Time : Sat Dec 15 16:37:57 MST 2012

如果你需要重復(fù)提供日期,那么利用這種方式來格式化它的每一部分就有點(diǎn)復(fù)雜了。因此,可以利用一個(gè)格式化字符串指出要被格式化的參數(shù)的索引。

索引必須緊跟在%后面,而且必須以$結(jié)束。例如:

import java.util.Date;
  
public class Main{
   public static void main(String args[]) {
       // 初始化 Date 對象
       Date date = new Date();
        
       // 使用toString()顯示日期和時(shí)間
       System.out.printf("%1$s %2$tB %2$td, %2$tY", 
                         "Due date:", date);
   }
}

以上實(shí)例編譯運(yùn)行結(jié)果如下:

Due date: February 09, 2004

或者,你可以使用<標(biāo)志。它表明先前被格式化的參數(shù)要被再次使用。例如:

import java.util.Date;
  
public class Main{

   public static void main(String args[]) {
       // 初始化 Date 對象
       Date date = new Date();
        
       // 顯示格式化時(shí)間
       System.out.printf("%s %tB %<te, %<tY",
                           "Due date:", date);
   }
} 

以上實(shí)例編譯運(yùn)行結(jié)果如下:

Due date: February 09, 2004

日期和時(shí)間轉(zhuǎn)換字符

字符 描述 例子
c 完整的日期和時(shí)間 Mon May 04 09:51:52 CDT 2009
F ISO 8601 格式日期 2004-02-09
D U.S. 格式日期 (月/日/年) 02/09/2004
T 24小時(shí)時(shí)間 18:05:19
r 12小時(shí)時(shí)間 06:05:19 pm
R 24小時(shí)時(shí)間,不包含秒 18:05
Y 4位年份(包含前導(dǎo)0) 2004
y 年份后2位(包含前導(dǎo)0) 04
C 年份前2位(包含前導(dǎo)0) 20
B 月份全稱 February
b 月份簡稱 Feb
n 2位月份(包含前導(dǎo)0) 02
d 2位日子(包含前導(dǎo)0) 03
e 2位日子(不包含前導(dǎo)0) 9
A 星期全稱 Monday
a 星期簡稱 Mon
j 3位年份(包含前導(dǎo)0) 069
H 2位小時(shí)(包含前導(dǎo)0), 00 到 23 18
k 2位小時(shí)(不包含前導(dǎo)0),  0 到 23 18
I 2位小時(shí)(包含前導(dǎo)0), 01 到 12 06
l 2位小時(shí)(不包含前導(dǎo)0),  1 到 12 6
M 2位分鐘(包含前導(dǎo)0) 05
S 2位秒數(shù)(包含前導(dǎo)0) 19
L 3位毫秒(包含前導(dǎo)0) 047
N 9位納秒(包含前導(dǎo)0) 047000000
P 大寫上下午標(biāo)志 PM
p 小寫上下午標(biāo)志 pm
z 從GMT的RFC 822數(shù)字偏移 -0800
Z 時(shí)區(qū) PST
s 自 1970-01-01 00:00:00 GMT的秒數(shù) 1078884319
Q 自 1970-01-01 00:00:00 GMT的毫妙 1078884319047

還有其他有用的日期和時(shí)間相關(guān)的類。對于更多的細(xì)節(jié),你可以參考到Java標(biāo)準(zhǔn)文檔。


解析字符串為時(shí)間

SimpleDateFormat 類有一些附加的方法,特別是parse(),它試圖按照給定的SimpleDateFormat 對象的格式化存儲來解析字符串。例如:

import java.util.*;
import java.text.*;
  
public class Main{

   public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 

      String input = args.length == 0 ? "1818-11-11" : args[0]; 

      System.out.print(input + " Parses as "); 

      Date t; 

      try { 
          t = ft.parse(input); 
          System.out.println(t); 
      } catch (ParseException e) { 
          System.out.println("Unparseable using " + ft); 
      }
   }
}

以上實(shí)例編譯運(yùn)行結(jié)果如下:

$ java DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
$ java DateDemo 2007-12-01
2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007

Java 休眠(sleep)

你可以讓程序休眠一毫秒的時(shí)間或者到您的計(jì)算機(jī)的壽命長的任意段時(shí)間。例如,下面的程序會休眠3秒:

import java.util.*;
  
public class Main{
   public static void main(String args[]) {
      try { 
         System.out.println(new Date( ) + "\n"); 
         Thread.sleep(5*60*10); 
         System.out.println(new Date( ) + "\n"); 
      } catch (Exception e) { 
          System.out.println("Got an exception!"); 
      }
   }
}

以上實(shí)例編譯運(yùn)行結(jié)果如下:

Sun May 03 18:04:41 GMT 2009

Sun May 03 18:04:44 GMT 2009

測量時(shí)間

下面的一個(gè)例子表明如何測量時(shí)間間隔(以毫秒為單位):

import java.util.*;
  
public class Main{

   public static void main(String args[]) {
      try {
         long start = System.currentTimeMillis( );
         System.out.println(new Date( ) + "\n");
         Thread.sleep(5*60*10);
         System.out.println(new Date( ) + "\n");
         long end = System.currentTimeMillis( );
         long diff = end - start;
         System.out.println("Difference is : " + diff);
      } catch (Exception e) {
         System.out.println("Got an exception!");
      }
   }
}

以上實(shí)例編譯運(yùn)行結(jié)果如下:

Sun May 03 18:16:51 GMT 2009

Sun May 03 18:16:54 GMT 2009

Difference is : 3050

Calendar類

我們現(xiàn)在已經(jīng)能夠格式化并創(chuàng)建一個(gè)日期對象了,但是我們?nèi)绾尾拍茉O(shè)置和獲取日期數(shù)據(jù)的特定部分呢,比如說小時(shí),日,或者分鐘? 我們又如何在日期的這些部分加上或者減去值呢? 答案是使用Calendar 類。

Calendar類的功能要比Date類強(qiáng)大很多,而且在實(shí)現(xiàn)方式上也比Date類要復(fù)雜一些。

Calendar類是一個(gè)抽象類,在實(shí)際使用時(shí)實(shí)現(xiàn)特定的子類的對象,創(chuàng)建對象的過程對程序員來說是透明的,只需要使用getInstance方法創(chuàng)建即可。

創(chuàng)建一個(gè)代表系統(tǒng)當(dāng)前日期的Calendar對象

Calendar c = Calendar.getInstance();//默認(rèn)是當(dāng)前日期

創(chuàng)建一個(gè)指定日期的Calendar對象

使用Calendar類代表特定的時(shí)間,需要首先創(chuàng)建一個(gè)Calendar的對象,然后再設(shè)定該對象中的年月日參數(shù)來完成。

//創(chuàng)建一個(gè)代表2009年6月12日的Calendar對象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);

Calendar類對象字段類型

Calendar類中用一下這些常量表示不同的意義,jdk內(nèi)的很多類其實(shí)都是采用的這種思想

常量 描述
Calendar.YEAR 年份
Calendar.MONTH 月份
Calendar.DATE 日期
Calendar.DAY_OF_MONTH 日期,和上面的字段意義完全相同
Calendar.HOUR 12小時(shí)制的小時(shí)
Calendar.HOUR_OF_DAY 24小時(shí)制的小時(shí)
Calendar.MINUTE 分鐘
Calendar.SECOND
Calendar.DAY_OF_WEEK 星期幾

Calendar類對象信息的設(shè)置

Set設(shè)置

如:

Calendar c1 = Calendar.getInstance();

調(diào)用:

public final void set(int year,int month,int date)
c1.set(2009, 6 - 1, 12);//把Calendar對象c1的年月日分別設(shè)這為:2009、5、12

利用字段類型設(shè)置

如果只設(shè)定某個(gè)字段,例如日期的值,則可以使用如下set方法:

public void set(int field,int value)

把 c1對象代表的日期設(shè)置為10號,其它所有的數(shù)值會被重新計(jì)算

c1.set(Calendar.DATE,10);

把c1對象代表的年份設(shè)置為2008年,其他的所有數(shù)值會被重新計(jì)算

c1.set(Calendar.YEAR,2008);

其他字段屬性set的意義以此類推

Add設(shè)置

Calendar c1 = Calendar.getInstance();

把c1對象的日期加上10,也就是c1所表的日期的10天后的日期,其它所有的數(shù)值會被重新計(jì)算

c1.add(Calendar.DATE, 10);

把c1對象的日期減去10,也就是c1所表的日期的10天前的日期,其它所有的數(shù)值會被重新計(jì)算

c1.add(Calendar.DATE, -10);

其他字段屬性的add的意義以此類推

Calendar類對象信息的獲得

Calendar c1 = Calendar.getInstance();
// 獲得年份
int year = c1.get(Calendar.YEAR);
// 獲得月份
int month = c1.get(Calendar.MONTH) + 1;
// 獲得日期
int date = c1.get(Calendar.DATE);
// 獲得小時(shí)
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 獲得分鐘
int minute = c1.get(Calendar.MINUTE);
// 獲得秒
int second = c1.get(Calendar.SECOND);
// 獲得星期幾(注意(這個(gè)與Date類是不同的):1代表星期日、2代表星期1、3代表星期二,以此類推)
int day = c1.get(Calendar.DAY_OF_WEEK);

GregorianCalendar類

Calendar類實(shí)現(xiàn)了公歷日歷,GregorianCalendar是Calendar類的一個(gè)具體實(shí)現(xiàn)。

Calendar 的getInstance()方法返回一個(gè)默認(rèn)用當(dāng)前的語言環(huán)境和時(shí)區(qū)初始化的GregorianCalendar對象。GregorianCalendar定義了兩個(gè)字段:AD和BC。這些代表公歷定義的兩個(gè)時(shí)代。

下面列出GregorianCalendar對象的幾個(gè)構(gòu)造方法:

序號 構(gòu)造函數(shù)和說明
1 GregorianCalendar()
在具有默認(rèn)語言環(huán)境的默認(rèn)時(shí)區(qū)內(nèi)使用當(dāng)前時(shí)間構(gòu)造一個(gè)默認(rèn)的 GregorianCalendar。
2 GregorianCalendar(int year, int month, int date)
在具有默認(rèn)語言環(huán)境的默認(rèn)時(shí)區(qū)內(nèi)構(gòu)造一個(gè)帶有給定日期設(shè)置的 GregorianCalendar
3 GregorianCalendar(int year, int month, int date, int hour, int minute)
為具有默認(rèn)語言環(huán)境的默認(rèn)時(shí)區(qū)構(gòu)造一個(gè)具有給定日期和時(shí)間設(shè)置的 GregorianCalendar。
4 GregorianCalendar(int year, int month, int date, int hour, int minute, int second)
  為具有默認(rèn)語言環(huán)境的默認(rèn)時(shí)區(qū)構(gòu)造一個(gè)具有給定日期和時(shí)間設(shè)置的 GregorianCalendar。
5 GregorianCalendar(Locale aLocale)
在具有給定語言環(huán)境的默認(rèn)時(shí)區(qū)內(nèi)構(gòu)造一個(gè)基于當(dāng)前時(shí)間的 GregorianCalendar。
6 GregorianCalendar(TimeZone zone)
在具有默認(rèn)語言環(huán)境的給定時(shí)區(qū)內(nèi)構(gòu)造一個(gè)基于當(dāng)前時(shí)間的 GregorianCalendar。
7 GregorianCalendar(TimeZone zone, Locale aLocale)
 在具有給定語言環(huán)境的給定時(shí)區(qū)內(nèi)構(gòu)造一個(gè)基于當(dāng)前時(shí)間的 GregorianCalendar。

這里是GregorianCalendar 類提供的一些有用的方法列表:

序號 方法和說明
1 void add(int field, int amount)
根據(jù)日歷規(guī)則,將指定的(有符號的)時(shí)間量添加到給定的日歷字段中。
2 protected void computeFields()
轉(zhuǎn)換UTC毫秒值為時(shí)間域值
3 protected void computeTime()
覆蓋Calendar ,轉(zhuǎn)換時(shí)間域值為UTC毫秒值
4 boolean equals(Object obj)
比較此 GregorianCalendar 與指定的 Object。
5 int get(int field)
獲取指定字段的時(shí)間值
6 int getActualMaximum(int field)
返回當(dāng)前日期,給定字段的最大值
7 int getActualMinimum(int field)
返回當(dāng)前日期,給定字段的最小值
8 int getGreatestMinimum(int field)
 返回此 GregorianCalendar 實(shí)例給定日歷字段的最高的最小值。
9 Date getGregorianChange()
獲得格里高利歷的更改日期。
10 int getLeastMaximum(int field)
返回此 GregorianCalendar 實(shí)例給定日歷字段的最低的最大值
11 int getMaximum(int field)
返回此 GregorianCalendar 實(shí)例的給定日歷字段的最大值。
12 Date getTime()
獲取日歷當(dāng)前時(shí)間。
13 long getTimeInMillis()
獲取用長整型表示的日歷的當(dāng)前時(shí)間
14 TimeZone getTimeZone()
獲取時(shí)區(qū)。
15 int getMinimum(int field)
返回給定字段的最小值。
16 int hashCode()
重寫hashCode.
17 boolean isLeapYear(int year)
確定給定的年份是否為閏年。
18 void roll(int field, boolean up)
在給定的時(shí)間字段上添加或減去(上/下)單個(gè)時(shí)間單元,不更改更大的字段。
19 void set(int field, int value)
用給定的值設(shè)置時(shí)間字段。
20 void set(int year, int month, int date)
設(shè)置年、月、日的值。
21 void set(int year, int month, int date, int hour, int minute)
設(shè)置年、月、日、小時(shí)、分鐘的值。
22 void set(int year, int month, int date, int hour, int minute, int second)
設(shè)置年、月、日、小時(shí)、分鐘、秒的值。
23 void setGregorianChange(Date date)
設(shè)置 GregorianCalendar 的更改日期。
24 void setTime(Date date)
用給定的日期設(shè)置Calendar的當(dāng)前時(shí)間。
25 void setTimeInMillis(long millis)
用給定的long型毫秒數(shù)設(shè)置Calendar的當(dāng)前時(shí)間。
26 void setTimeZone(TimeZone value)
用給定時(shí)區(qū)值設(shè)置當(dāng)前時(shí)區(qū)。
27 String toString()
返回代表日歷的字符串。

實(shí)例

import java.util.*;
  
public class GregorianCalendarDemo {

   public static void main(String args[]) {
      String months[] = {
      "Jan", "Feb", "Mar", "Apr",
      "May", "Jun", "Jul", "Aug",
      "Sep", "Oct", "Nov", "Dec"};
      
      int year;
      // 初始化 Gregorian 日歷
      // 使用當(dāng)前時(shí)間和日期
      // 默認(rèn)為本地時(shí)間和時(shí)區(qū)
      GregorianCalendar gcalendar = new GregorianCalendar();
      // 顯示當(dāng)前時(shí)間和日期的信息
      System.out.print("Date: ");
      System.out.print(months[gcalendar.get(Calendar.MONTH)]);
      System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
      System.out.println(year = gcalendar.get(Calendar.YEAR));
      System.out.print("Time: ");
      System.out.print(gcalendar.get(Calendar.HOUR) + ":");
      System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
      System.out.println(gcalendar.get(Calendar.SECOND));
      
      // 測試當(dāng)前年份是否為閏年
      if(gcalendar.isLeapYear(year)) {
         System.out.println("當(dāng)前年份是閏年");
      }
      else {
         System.out.println("當(dāng)前年份不是閏年");
      }
   }
}

以上實(shí)例編譯運(yùn)行結(jié)果如下:

Date: Apr 22 2009
Time: 11:25:27
當(dāng)前年份不是閏年

關(guān)于Calender 類的完整列表,你可以參考標(biāo)準(zhǔn)的Java文檔。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號