Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(5) SimpleDateFormat


 

本章介紹SimpleDateFormat。

 


SimpleDateFormat 介紹

SimpleDateFormat 是一個格式化Date 以及 解析日期字符串 的工具。它的最常用途是,能夠按照指定的格式來對Date進行格式化,然后我們使用可以格式化Date后得到的字符串。
更嚴格的說,SimpleDateFormat 是一個以與語言環境有關的方式來格式化和解析日期的具體類。它允許進行格式化(日期 -> 文本)、解析(文本 -> 日期)和規范化。

 

SimpleDateFormat的構造函數:

// 構造函數
SimpleDateFormat()
SimpleDateFormat(String pattern)
SimpleDateFormat(String template, DateFormatSymbols value)
SimpleDateFormat(String template, Locale locale)

// 非構造函數
void                             applyLocalizedPattern(String template)
void                             applyPattern(String template)
Object                           clone()
boolean                          equals(Object object)
StringBuffer                     format(Date date, StringBuffer buffer, FieldPosition fieldPos)
AttributedCharacterIterator      formatToCharacterIterator(Object object)
Date                             get2DigitYearStart()
DateFormatSymbols                getDateFormatSymbols()
int                              hashCode()
Date                             parse(String string, ParsePosition position)
void                             set2DigitYearStart(Date date)
void                             setDateFormatSymbols(DateFormatSymbols value)
String                           toLocalizedPattern()
String                           toPattern()

 

SimpleDateFormat 簡單示范

// 新建date對象,時間是2013-09-19
Date date = new Date(113,8,19); 
// 新建“SimpleDateFormat對象”,並設置 sdf 的“格式化模式”
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 用 sdf 格式化 date,並返回字符串。
String str = sdf.format(date); 

 


SimpleDateFormat 相關格式說明

日期和時間模式

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

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

字母 日期或時間元素 表示 示例
G Era 標志符 Text AD
y Year 199696
M 年中的月份 Month JulyJul07
w 年中的周數 Number 27
W 月份中的周數 Number 2
D 年中的天數 Number 189
d 月份中的天數 Number 10
F 月份中的星期 Number 2
E 星期中的天數 Text TuesdayTue
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 TimePSTGMT-08:00
Z 時區 RFC 822 time zone -0800

模式字母通常是重復的,其數量確定其精確表示:

  • Text: 對於格式化來說,如果模式字母的數量大於等於 4,則使用完全形式;否則,在可用的情況下使用短形式或縮寫形式。對於解析來說,兩種形式都是可接受的,與模式字母的數量無關。
  • Number: 對於格式化來說,模式字母的數量是最小的數位,如果數位不夠,則用 0 填充以達到此數量。對於解析來說,模式字母的數量被忽略,除非必須分開兩個相鄰字段。
  • Year: 如果格式器的 Calendar 是格里高利歷,則應用以下規則。
    Month: 如果模式字母的數量為 3 或大於 3,則將月份解釋為 text;否則解釋為 number
    • 對於格式化來說,如果模式字母的數量為 2,則年份截取為 2 位數,否則將年份解釋為 number
    • 對於解析來說,如果模式字母的數量大於 2,則年份照字面意義進行解釋,而不管數位是多少。因此使用模式 "MM/dd/yyyy",將 "01/11/12" 解析為公元 12 年 1 月 11 日。
    • 在解析縮寫年份模式("y" 或 "yy")時,SimpleDateFormat 必須相對於某個世紀來解釋縮寫的年份。這通過將日期調整為 SimpleDateFormat 實例創建之前的 80 年和之后 20 年范圍內來完成。例如,在 "MM/dd/yy" 模式下,如果 SimpleDateFormat 實例是在 1997 年 1 月 1 日創建的,則字符串 "01/11/12" 將被解釋為 2012 年 1 月 11 日,而字符串 "05/04/64" 將被解釋為 1964 年 5 月 4 日。在解析時,只有恰好由兩位數字組成的字符串(如 Character#isDigit(char) 所定義的)被解析為默認的世紀。其他任何數字字符串將照字面意義進行解釋,例如單數字字符串,3 個或更多數字組成的字符串,或者不都是數字的兩位數字字符串(例如"-1")。因此,在相同的模式下, "01/02/3" 或 "01/02/003" 解釋為公元 3 年 1 月 2 日。同樣,"01/02/-3" 解析為公元前 4 年 1 月 2 日。
    否則,則應用日歷系統特定的形式。對於格式化和解析,如果模式字母的數量為 4 或大於 4,則使用日歷特定的 long form。否則,則使用日歷特定的 short or abbreviated form

SimpleDateFormat 還支持本地化日期和時間模式 字符串。在這些字符串中,以上所述的模式字母可以用其他與語言環境有關的模式字母來替換。SimpleDateFormat 不處理除模式字母之外的文本本地化;而由類的客戶端來處理。
示例

以下示例顯示了如何在美國語言環境中解釋日期和時間模式。給定的日期和時間為美國太平洋時區的本地時間 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

 

日期格式是不同步的。建議為每個線程創建獨立的格式實例。如果多個線程同時訪問一個格式,則它必須是外部同步的。

 


SimpleDateFormat 示例 

下面,我們通過實例學習如何使用SimpleDateFormat。

源碼如下(SimpleDateFormatTest.java):

 1 import java.util.Date;
 2 import java.util.Locale;
 3 import java.util.Calendar;
 4 import java.text.DateFormat;
 5 import java.text.SimpleDateFormat;
 6 
 7 /**
 8  * SimpleDateFormat 的API測試程序
 9  *
10  * @author skywang
11  * @email kuiwu-wang@163.com
12  */
13 public class SimpleDateFormatTest {
14     
15     public static void main(String[] args) {
16 
17         // 通過SimpleDateFormat 獲取日期/時間:有多種格式
18         testSimpleDateFormats() ;
19 
20         // 通過DateFormat 獲取日期/時間
21         superTest() ;
22     }
23 
24     /**
25      * 通過SimpleDateFormat 獲取日期/時間。有多種格式可以選擇
26      */
27     private static void testSimpleDateFormats() {
28         String[] formats = new String[] {
29             "HH:mm",                                // 14:22
30             "h:mm a",                               // 2:22 下午
31             "HH:mm z",                              // 14:22 CST
32             "HH:mm Z",                              // 14:22 +0800
33             "HH:mm zzzz",                           // 14:22 中國標准時間
34             "HH:mm:ss",                             // 14:22:30
35             "yyyy-MM-dd",                           // 2013-09-19
36             "yyyy-MM-dd HH:mm",                     // 2013-09-19 14:22
37             "yyyy-MM-dd HH:mm:ss",                  // 2013-09-19 14:22:30
38             "yyyy-MM-dd HH:mm:ss zzzz",             // 2013-09-19 14:22:30 中國標准時間
39             "EEEE yyyy-MM-dd HH:mm:ss zzzz",        // 星期四 2013-09-19 14:22:30 中國標准時間
40             "yyyy-MM-dd HH:mm:ss.SSSZ",             // 2013-09-19 14:22:30.000+0800
41             "yyyy-MM-dd'T'HH:mm:ss.SSSZ",           // 2013-09-19T14:22:30.000+0800
42             "yyyy.MM.dd G 'at' HH:mm:ss z",         // 2013.09.19 公元 at 14:22:30 CST
43             "K:mm a",                               // 2:22 下午, CST
44             "EEE, MMM d, ''yy",                     // 星期四, 九月 19, '13
45             "hh 'o''clock' a, zzzz",                // 02 o'clock 下午, 中國標准時間
46             "yyyyy.MMMMM.dd GGG hh:mm aaa",         // 02013.九月.19 公元 02:22 下午
47             "EEE, d MMM yyyy HH:mm:ss Z",           // 星期四, 19 九月 2013 14:22:30 +0800
48             "yyMMddHHmmssZ",                        // 130919142230+0800
49             "yyyy-MM-dd'T'HH:mm:ss.SSSZ",           // 2013-09-19T14:22:30.000+0800
50             "EEEE 'DATE('yyyy-MM-dd')' 'TIME('HH:mm:ss')' zzzz",        // 星期四 2013-09-19 14:22:30 中國標准時間
51         };
52 
53         //Date date = (new Date(0));                    // date為1970-01-01 07:00:00
54         //Date date = Calendar.getInstance().getTime(); // date為當前時間
55         Date date = new Date(113, 8, 19, 14, 22, 30);   // date為2013-09-19 14:22:30
56         for (String format : formats) {
57             SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.SIMPLIFIED_CHINESE);
58             //SimpleDateFormat sdf = new SimpleDateFormat(format);
59             System.out.format("%30s    %s\n", format, sdf.format(date));
60          }
61     }
62 
63     /**
64      * 通過DateFormat 獲取日期/時間
65      */
66     private static void superTest() {
67         // 新建date對象,時間是2013-09-19 14:22:30
68         // (01) 年=“‘目標年’ - 1900”,
69         // (02) 月。 0是一月,1是二月,依次類推。
70         // (03) 日。 1-31之間的數
71         Date mDate = new Date(113, 8, 19, 14, 22, 30);
72         Locale locale = new Locale("zh", "CN"); 
73 
74         // 14:22:30
75         String time = DateFormat.getTimeInstance( DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE).format(mDate);
76         // 2013-09-19
77         String date = DateFormat.getDateInstance( DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE).format(mDate);
78         // 2013-09-19 14:22:30
79         String datetime = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE).format(mDate);
80 
81         System.out.printf("\ntime=%s\ndate=%s\ndatetime=%s\n",time,date,datetime); 
82     }
83 }
View Code

運行結果: 

                         HH:mm    14:22
                        h:mm a    2:22 下午
                       HH:mm z    14:22 CST
                       HH:mm Z    14:22 +0800
                    HH:mm zzzz    14:22 中國標准時間
                      HH:mm:ss    14:22:30
                    yyyy-MM-dd    2013-09-19
              yyyy-MM-dd HH:mm    2013-09-19 14:22
           yyyy-MM-dd HH:mm:ss    2013-09-19 14:22:30
      yyyy-MM-dd HH:mm:ss zzzz    2013-09-19 14:22:30 中國標准時間
 EEEE yyyy-MM-dd HH:mm:ss zzzz    星期四 2013-09-19 14:22:30 中國標准時間
      yyyy-MM-dd HH:mm:ss.SSSZ    2013-09-19 14:22:30.000+0800
    yyyy-MM-dd'T'HH:mm:ss.SSSZ    2013-09-19T14:22:30.000+0800
  yyyy.MM.dd G 'at' HH:mm:ss z    2013.09.19 公元 at 14:22:30 CST
                        K:mm a    2:22 下午
              EEE, MMM d, ''yy    星期四, 九月 19, '13
         hh 'o''clock' a, zzzz    02 o'clock 下午, 中國標准時間
  yyyyy.MMMMM.dd GGG hh:mm aaa    02013.九月.19 公元 02:22 下午
    EEE, d MMM yyyy HH:mm:ss Z    星期四, 19 九月 2013 14:22:30 +0800
                 yyMMddHHmmssZ    130919142230+0800
    yyyy-MM-dd'T'HH:mm:ss.SSSZ    2013-09-19T14:22:30.000+0800
EEEE 'DATE('yyyy-MM-dd')' 'TIME('HH:mm:ss')' zzzz    星期四 DATE(2013-09-19) TIME(14:22:30) 中國標准時間

time=14:22:30
date=2013-9-19
datetime=2013-9-19 14:22:30

 

 


更多內容

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(1) Calendar

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(2) 自己封裝的Calendar接口

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(3) Date

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(4) DateFormat

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(5) SimpleDateFormat

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(6) Locale

Java Calendar,Date,DateFormat,TimeZone,Locale等時間相關內容的認知和使用(7) TimeZone

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM