Java 中時間跟日期處理的小記

jopen 12年前發布 | 29K 次閱讀 Java Java開發

經常會遇到處理時間和日期的情況,小記一下,呵呵。

     時間和日期中常用到的幾個類:java.util.Date,
                            java.util.Calendar,
                            java.util.GregorainCalendar,
                            java.text.DateFormat,
                            java.text.SimpleDateFormat

java.util.Date :

表示特定瞬間,精確到毫秒
一天是 24 60 60 = 86400 秒
世界時(UT 或 UTC) , 格林威治時間 (GMT), 格林威治時(GMT)和世界時(UT)
是相等的,格林威治時(GMT) 是標準的"民間"稱呼, 世界時(UT) 是相同標準的
科學稱呼。UTC 和 UT 的區別是:UTC 是基于原子時鐘的,UT 是基于天體觀察的。
(中文版的jdk 真是好啊,跟科普教材是的,呵呵)

常用的構造方法 :

Date();

Date(long date)

(long date)  表示從標準基準時間(稱為 "歷元" epoch ,即 1970.1.1
00:00:00 GMT)經歷的毫秒數。

還有一些構造方法已經 deprecated 了

主要的方法:(介紹幾個常用的,詳細的查詢 jdk 文檔)

boolean after(Date when)   測試日期在此日期之后。

boolean before(Date when)  測試日期在此日期之前。

Object clone()  返回此對象的副本

long getTime()  返回自 1970.1.1 00:00:00 GMT 后,此對象表示的毫秒數

void setTime(long time) 設置此 Date 對象,以表示 1970 年 1 月 1 日
00:00:00 GMT 以后 time 毫秒的時間點。

String toString() 將 Date 對象轉化成以下形式的
String:dow mon dd hh:mm:ss zzz yyyy

其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
mon 是月份 (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep,
Oct, Nov, Dec)。

dd 是一月中的某一天(01 至 31),顯示為兩位十進制數。
hh 是一天中的小時(00 至 23),顯示為兩位十進制數。
mm 是小時中的分鐘(00 至 59),顯示為兩位十進制數。
ss 是分鐘中的秒數(00 至 61),顯示為兩位十進制數。 60,61 是因為有"潤秒"
zzz 是時區(并可以反映夏令時)。標準時區縮寫包括方法 parse 識別的時區縮寫。
如果不提供時區信息,則 zzz 為空,即根本不包括任何字符。
yyyy 是年份,顯示為 4 位十進制數。

使用 System.currentTimeMillis() 獲得當前系統時間的毫秒數

java.util.Calendar :

Calendar 類是一個抽象類.

Calendar rightNow = Calendar.getInstance();

可以使用三種方法更改日歷字段:set()、add() 和 roll()。

set(f, value) 將日歷字段 f 更改為 value。
此外,它設置了一個內部成員變量,以指示日歷字段 f 已經被更改。盡管日歷字段
f 是立即更改的,但是直到下次調用 get()、getTime()、getTimeInMillis()、
add() 或 roll() 時才會重新計算日歷的時間值(以毫秒為單位)。因此,多次調
用 set() 不會觸發多次不必要的計算。

add(f, delta) 將 delta 添加到 f 字段中。這等同于調用
set(f, get(f) + delta)

roll(f, delta) 將 delta 添加到 f 字段中,但不更改更大的字段。

java.util.GregorianCalendar:
GregorianCalendar 是 Calendar 的一個具體子類,提供了世界上大多數國家
使用的標準日歷系統。

java.text.DateFormat:
DateFormat 是日期/時間格式化子類的抽象類,它以與語言無關的方式格式化并
分析日期或時間。

java.text.SimpleDateFormat:

SimpleDateFormat 是一個以與語言環境相關的方式來格式化和分析日期的具體類。
它允許進行格式化(日期 -> 文本)、分析(文本 -> 日期)和規范化。

SimpleDateFormat 使得可以選擇任何用戶定義的日期-時間格式的模式。但是,
仍然建議通過 DateFormat 中的 getTimeInstance、getDateInstance 或
getDateTimeInstance 來新的創建日期-時間格式化程序。每一個這樣的類方法
都能夠返回一個以默認格式模式初始化的日期/時間格式化程序。可以根據需要使用
applyPattern 方法來修改格式模式。

日期和時間格式由日期和時間模式 字符串指定。
在日期和時間模式字符串中,未加引號的字母 'A' 到 'Z' 和 'a' 到 'z'
被解釋為模式字母,用來表示日期或時間字符串元素。


引用

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






引用

日期和時間模式                                   結果 
"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 


獲得當前系統的毫秒數:


運行結果:
引用

date = Mon Dec 04 16:01:16 CST 2006
millisecond = 1165219276771
date1 = Mon Dec 04 16:01:16 CST 2006



package org.lokvin.example.calendar;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class CalendarExample2 {

    public static void main(String[] args) {
        //獲得當前日期
        Calendar calendar = Calendar.getInstance();
        int era = calendar.get(Calendar.ERA);// 0 = BC, 1 = AD
        System.out.println("ERA = " + era);
        int year = calendar.get(Calendar.YEAR); //2006
        System.out.println("YEAR = " + year);
        int month = calendar.get(Calendar.MONTH);
        //獲得當前月份, 0..11 表示 JAN..DEC
        System.out.println("Month = " + month);//0 = JAN ... 11 = DEC
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println("Day of Month = " + day); // 1
        //獲得日期在本周的天數, Sun=1, Mon=2 ... Sta=7
        int day_of_week = calendar.get(Calendar.DAY_OF_WEEK);
        System.out.println("Day of Week = " + day_of_week);

        //獲得當前時間 12 時制是 Calendar.HOUR
        int hour12 = calendar.get(Calendar.HOUR);
        //獲得 AM ,PM , 0 = AM, 1 = PM
        int ampm = calendar.get(Calendar.AM_PM);
        System.out.println("hour 12 = " + hour12);
        System.out.println("am pm = " + ampm); //0 = am , 1 = pm
        //獲得當前時間 24 時制 Calendar.HOUR_OF_DAY
        int hour24 = calendar.get(Calendar.HOUR_OF_DAY);
        System.out.println("hour 24 = " + hour24);


        Calendar today = new GregorianCalendar(2006, Calendar.DECEMBER, 4);
        //Calendar.getInstance() 得到當前具體到毫秒的一個時間點
        System.out.println("calendar = " + calendar.getTime().toString());
        //通過 new GregorianCalendar(2006, Calendar.DECEMBER, 4)
        //生成的 calendar 除了指定的年,月,日其余為0(時分秒=0)
        System.out.println("today = " + today.getTime().toString());


    }

}


運行結果:
引用

ERA = 1
YEAR = 2006
Month = 11
Day of Month = 4
Day of Week = 2
hour 12 = 4
am pm = 1
hour 24 = 16
calendar = Mon Dec 04 16:22:42 CST 2006
today = Mon Dec 04 00:00:00 CST 2006


兩個日期之間的比較:
package org.lokvin.example.calendar;

import java.util.Calendar;
import java.util.GregorianCalendar;

/*
 * 比較兩個 calendar 對象之間的先后
 */
public class CalendarExample3 {

    public static void main(String[] args) {
        //日期比較
        Calendar xmas = new GregorianCalendar(2006, Calendar.DECEMBER, 25);
        Calendar newYear = new GregorianCalendar(2007, Calendar.JANUARY, 1);

        //比較兩個日期先后
        boolean flag = xmas.before(newYear);
        System.out.println("flag = " + flag);

        flag = xmas.after(newYear);
        System.out.println("flag = " + flag);

        //兩個日期相差的毫秒數
        long timeDiffMillis = newYear.getTimeInMillis() - xmas.getTimeInMillis();
        System.out.println("time diff millis = " + timeDiffMillis);

        //兩個日期相差的秒數
        long diffSecs = timeDiffMillis / 1000;
        System.out.println("time diff secs = " + diffSecs);

        //兩個日期相差的分鐘
        long diffMins = timeDiffMillis / (1000 * 60);
        System.out.println("time diff mins = " + diffMins);

        //兩個日期相差的小時
        long diffHours = timeDiffMillis / (1000 * 60 * 60);
        System.out.println("time diff hours = " + diffHours);

        //兩個日期相差的天
        long diffDays = timeDiffMillis / (1000 * 60 * 60 * 24);
        System.out.println("time diff days = " + diffDays);

    }

}

運行結果:

引用

flag = true
flag = false
time diff millis = 604800000
time diff secs = 604800
time diff mins = 10080
time diff hours = 168
time diff days = 7



使用Calendar 計算年齡:

package org.lokvin.example.calendar;

import java.util.Calendar;
import java.util.GregorianCalendar;

/*
 * 計算年齡
 */
public class CalendarExample4 {

    public static void main(String[] args) {
        //創建生日的 Calendar 對象
        Calendar birthDate = new GregorianCalendar(1979, Calendar.JULY, 7);
        Calendar today = Calendar.getInstance();
        int age = today.get(Calendar.YEAR) - birthDate.get(Calendar.YEAR);

        //如果還沒有過生日,則 age - 1
        birthDate.add(Calendar.YEAR, age);
        if(today.before(birthDate)){
            age--;
        }
        System.out.println("age = " + age);
    }



}


判斷是否為閏年:

package org.lokvin.example.calendar;

import java.util.GregorianCalendar;

/*
 * 判斷是否為閏年 leap year
 */
public class CalendarExample5 {

    public static void main(String[] args) {
        //判斷是否"閏年" leap year
        GregorianCalendar cal = new GregorianCalendar();
        boolean isLeapYear = cal.isLeapYear(1998);
        System.out.println("is leap year 1998 = " + isLeapYear);
        isLeapYear = cal.isLeapYear(2000);
        System.out.println("is leap year 2000 = " + isLeapYear);
    }
}

運行結果 :
引用

is leap year 1998 = false
is leap year 2000 = true


獲得其他時區的時間:
package org.lokvin.example.calendar;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

/*
 * 獲得其他時區當前時間
 */

public class CalendarExample6 {

    public static void main(String[] args) {

        Calendar cal = new GregorianCalendar();
        int hour12 = cal.get(Calendar.HOUR);
        int hour24 = cal.get(Calendar.HOUR_OF_DAY);
        System.out.println("hour12 in our timezone = " + hour12);
        System.out.println("hour24 in our timezone = " + hour24);

        //獲得其他時區的當前時間,根據 zoneId 獲得時區
        Calendar calJap = new GregorianCalendar(TimeZone.getTimeZone("Japan"));
        hour12 = calJap.get(Calendar.HOUR);
        System.out.println("hour12 in japs timezone = " + hour12);
        hour24 = calJap.get(Calendar.HOUR_OF_DAY);
        System.out.println("hour24 in japs timezone = " + hour24);

        //獲得 zoneId 的列表
        String[] zoneIds = TimeZone.getAvailableIDs();
        for(int i=0; i<zoneIds.length; i++) {
            String zoneId = zoneIds[i];
            System.out.println("zone id = " + zoneId);
        }
    }
}


運行結果:
引用

hour12 in our timezone = 5
hour24 in our timezone = 17
hour12 in japs timezone = 6
hour24 in japs timezone = 18
zone id = Etc/GMT+12
zone id = Etc/GMT+11
zone id = MIT
zone id = Pacific/Apia
zone id = Pacific/Midway
...


格式化日期:
package org.lokvin.example.calendar;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateForamExample {
    public static void main(String[] args) {
        Date rightNow = new Date();
        DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        DateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");
        DateFormat format3 = new SimpleDateFormat("h:mm a");
        DateFormat format4 = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
        DateFormat format5 = new SimpleDateFormat("EEE, MMM, dd, ''yyyy");
        DateFormat format6 = new SimpleDateFormat("yyyy.MM.dd kk:mm 'o''clock' a, zzzz");
        DateFormat format7 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");

        System.out.println("format1 = " + format1.format(rightNow));
        System.out.println("format2 = " + format2.format(rightNow));
        System.out.println("format3 = " + format3.format(rightNow));
        System.out.println("format4 = " + format4.format(rightNow));
        System.out.println("format5 = " + format5.format(rightNow));
        System.out.println("format6 = " + format6.format(rightNow));
        System.out.println("format7 = " + format7.format(rightNow));
    }

}

輸出結果:
引用

format1 = 2006-12-05 06:12:02
format2 = 2006-12-05
format3 = 6:12 下午
format4 = 2006.12.05 公元 at 18:12:02 CST
format5 = 星期二, 十二月, 05, '2006
format6 = 2006.12.05 18:12 o'clock 下午, 中國標準時間
format7 = 02006.十二月.05 公元 06:12 下午
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!