詳解Java中格局化日期的DateFormat與SimpleDateFormat類。本站提示廣大學習愛好者:(詳解Java中格局化日期的DateFormat與SimpleDateFormat類)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java中格局化日期的DateFormat與SimpleDateFormat類正文
DateFormat
1. DateFormat 引見
DateFormat 的感化是 格局化並解析“日期/時光”。現實上,它是Date的格局化對象,它能贊助我們格局化Date,進而將Date轉換成我們想要的String字符串供我們應用
不外DateFormat的格局化Date的功效無限,沒有SimpleDateFormat壯大;但DateFormat是SimpleDateFormat的父類。所以,我們先對DateFormat有個全體懂得,然後再進修SimpleDateFormat。
DateFormat 的感化是格局化Date。它支撐格局化作風包含 FULL、LONG、MEDIUM 和 SHORT 共4種:
(01) DateFormat.SHORT
完整為數字,如 12.13.52 或 3:30pm
(02) DateFormat.MEDIUM
較長,如 Jan 12, 1952
(03) DateFormat.LONG
更長,如 January 12, 1952 或 3:30:32pm
(04) DateFormat.FULL
是完整指定,如 Tuesday、April 12、1952 AD 或 3:30:42pm PST。
DateFormat 的界說以下
public abstract class NumberFormat extends Format {}
DateFormat 的函數接口
默許結構函數:
DateFormat()
非結構函數:
Object clone() boolean equals(Object object) abstract StringBuffer format(Date date, StringBuffer buffer, FieldPosition field) final StringBuffer format(Object object, StringBuffer buffer, FieldPosition field) final String format(Date date) static Locale[] getAvailableLocales() Calendar getCalendar() final static DateFormat getInstance() final static DateFormat getDateInstance() final static DateFormat getDateInstance(int style) final static DateFormat getDateInstance(int style, Locale locale) final static DateFormat getTimeInstance() final static DateFormat getTimeInstance(int style) final static DateFormat getTimeInstance(int style, Locale locale) final static DateFormat getDateTimeInstance() final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle) final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale) NumberFormat getNumberFormat() TimeZone getTimeZone() int hashCode() boolean isLenient() Date parse(String string) abstract Date parse(String string, ParsePosition position) Object parseObject(String string, ParsePosition position) void setCalendar(Calendar cal) void setLenient(boolean value) void setNumberFormat(NumberFormat format) void setTimeZone(TimeZone timezone)
留意:DateFormat是一個籠統類。
當我們經由過程DateFormat的 getInstance(), getDateInstance()和getDateTimeInstance() 獲得DateFormat實例時;現實上是前往的SimpleDateFormat對象。
上面的函數現實上都是前往的SimpleDateFormat對象。
final static DateFormat getInstance() final static DateFormat getTimeInstance() final static DateFormat getTimeInstance(int style) final static DateFormat getTimeInstance(int style, Locale locale) final static DateFormat getDateInstance() final static DateFormat getDateInstance(int style) final static DateFormat getDateInstance(int style, Locale locale) final static DateFormat getDateTimeInstance() final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle) final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale)
這些函數在SimpleDateFormat.java中的界說以下:
public static final int FULL = 0; public static final int LONG = 1; public static final int MEDIUM = 2; public static final int SHORT = 3; public static final int DEFAULT = MEDIUM; public final static DateFormat getInstance() { return getDateTimeInstance(SHORT, SHORT); } public final static DateFormat getTimeInstance() { return get(DEFAULT, 0, 1, Locale.getDefault()); } public final static DateFormat getTimeInstance(int style) { return get(style, 0, 1, Locale.getDefault()); } public final static DateFormat getTimeInstance(int style, Locale aLocale) { return get(style, 0, 1, aLocale); } public final static DateFormat getDateInstance() { return get(0, DEFAULT, 2, Locale.getDefault()); } public final static DateFormat getDateInstance(int style) { return get(0, style, 2, Locale.getDefault()); } public final static DateFormat getDateInstance(int style, Locale aLocale) { return get(0, style, 2, aLocale); } public final static DateFormat getDateTimeInstance() { return get(DEFAULT, DEFAULT, 3, Locale.getDefault()); } public final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle) { return get(timeStyle, dateStyle, 3, Locale.getDefault()); } public final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale) { return get(timeStyle, dateStyle, 3, aLocale); } /** * 獲得DateFormat實例,現實上是前往SimpleDateFormat對象。 * * timeStyle -- 值可認為“FULL”或“LONG”或“MEDIUM”或“SHORT” * dateStyle -- 值可認為“FULL”或“LONG”或“MEDIUM”或“SHORT” * flags -- 值可認為“1”或“2”或“3”。 * 1 表現獲得“時光款式” * 2 表現獲得“日期款式” * 3 表現獲得“時光和日期款式” * loc -- locale對象,表現“區域” */ private static DateFormat get(int timeStyle, int dateStyle, int flags, Locale loc) { if ((flags & 1) != 0) { if (timeStyle < 0 || timeStyle > 3) { throw new IllegalArgumentException("Illegal time style " + timeStyle); } } else { timeStyle = -1; } if ((flags & 2) != 0) { if (dateStyle < 0 || dateStyle > 3) { throw new IllegalArgumentException("Illegal date style " + dateStyle); } } else { dateStyle = -1; } try { // Check whether a provider can provide an implementation that's closer // to the requested locale than what the Java runtime itself can provide. LocaleServiceProviderPool pool = LocaleServiceProviderPool.getPool(DateFormatProvider.class); if (pool.hasProviders()) { DateFormat providersInstance = pool.getLocalizedObject( DateFormatGetter.INSTANCE, loc, timeStyle, dateStyle, flags); if (providersInstance != null) { return providersInstance; } } return new SimpleDateFormat(timeStyle, dateStyle, loc); } catch (MissingResourceException e) { return new SimpleDateFormat("M/d/yy h:mm a"); } }
經由過程下面的代碼,我們可以或許進一步的熟悉到:DateFormat的感化是格局化Date;贊助我們將Date轉換成我們須要的String字符串。DateFormat供給的功效異常無限,它只能支撐FULL、LONG、MEDIUM 和 SHORT 這4種格局。並且,我們獲得DateFormat實例時,現實上是前往的SimpleDateFormat對象。
2. DateFormat 實例
上面,我們經由過程實例進修應用DateFormat的經常使用API。
源碼以下(DateFormatTest.java):
import java.util.Date; import java.util.Locale; import java.text.DateFormat; import java.text.FieldPosition; /** * DateFormat 的API測試法式 */ public class DateFormatTest { public static void main(String[] args) { // 只顯示“時光”:挪用getTimeInstance()函數 testGetTimeInstance() ; // 只顯示“日期”:挪用getDateInstance()函數 testGetDateInstance() ; // 顯示“日期”+“時光”:挪用getDateTimeInstance()函數 testGetDateTimeInstance() ; // 測試format()函數 testFormat(); } /** * 測試DateFormat的getTimeInstance()函數 * 它共有3種重載情勢: * (01) getTimeInstance() * (02) getTimeInstance(int style) * (03) getTimeInstance(int style, Locale locale) * * @author skywang */ private static void testGetTimeInstance() { Date date = new Date(); //Locale locale = new Locale("fr", "FR"); Locale locale = new Locale("zh", "CN"); // 等價於 DateFormat.getTimeInstance( DateFormat.MEDIUM); DateFormat short0 = DateFormat.getTimeInstance( ); // 參數是:“時光的顯示款式” DateFormat short1 = DateFormat.getTimeInstance( DateFormat.SHORT); DateFormat medium1 = DateFormat.getTimeInstance( DateFormat.MEDIUM); DateFormat long1 = DateFormat.getTimeInstance( DateFormat.LONG); DateFormat full1 = DateFormat.getTimeInstance( DateFormat.FULL); // 參數是:“時光的顯示款式” 和 “地域” DateFormat short2 = DateFormat.getTimeInstance( DateFormat.SHORT, locale); DateFormat medium2 = DateFormat.getTimeInstance( DateFormat.MEDIUM, locale); DateFormat long2 = DateFormat.getTimeInstance( DateFormat.LONG, locale); DateFormat full2 = DateFormat.getTimeInstance( DateFormat.FULL, locale); System.out.println("\n----getTimeInstance ----\n" + "(1.0) Empty Param : " + short0.format(date) +"\n" + "(2.1) One Param(s) : " + short1.format(date) +"\n" + "(2.2) One Param(m) : " + medium1.format(date) +"\n" + "(2.3) One Param(l) : " + long1.format(date) +"\n" + "(2.4) One Param(f) : " + full1.format(date) +"\n" + "(3.1) One Param(s,l): " + short2.format(date) +"\n" + "(3.2) One Param(m,l): " + medium2.format(date) +"\n" + "(3.3) One Param(l,l): " + long2.format(date) +"\n" + "(3.4) One Param(f,l): " + full2.format(date) +"\n" ); } /** * 測試DateFormat的getDateTimeInstance()函數 * 它共有3種重載情勢: * (01) getDateInstance() * (02) getDateInstance(int style) * (03) getDateInstance(int style, Locale locale) */ public static void testGetDateTimeInstance() { Date date = new Date(); Locale locale = new Locale("zh", "CN"); // 等價於 DateFormat.getDateTimeInstance( DateFormat.MEDIUM); DateFormat short0 = DateFormat.getDateTimeInstance( ); DateFormat short1 = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT); DateFormat medium1 = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM); DateFormat long1 = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.LONG); DateFormat full1 = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL); DateFormat short2 = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT, locale); DateFormat medium2 = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM, locale); DateFormat long2 = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.LONG, locale); DateFormat full2 = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL, locale); System.out.println("\n----getDateTimeInstance ----\n" + "(1.0) Empty Param : " + short0.format(date) +"\n" + "(2.1) One Param(s) : " + short1.format(date) +"\n" + "(2.2) One Param(m) : " + medium1.format(date) +"\n" + "(2.3) One Param(l) : " + long1.format(date) +"\n" + "(2.4) One Param(f) : " + full1.format(date) +"\n" + "(3.1) One Param(s,l): " + short2.format(date) +"\n" + "(3.2) One Param(m,l): " + medium2.format(date) +"\n" + "(3.3) One Param(l,l): " + long2.format(date) +"\n" + "(3.4) One Param(f,l): " + full2.format(date) +"\n" ); } /** * 測試DateFormat的getDateInstance()函數 * 它共有3種重載情勢: * (01) getDateTimeInstance() * (02) getDateTimeInstance(int dateStyle, int timeStyle) * (03) getDateTimeInstance(int dateStyle, int timeStyle, Locale locale) */ public static void testGetDateInstance() { Date date = new Date(); //Locale locale = new Locale("en", "US"); Locale locale = new Locale("zh", "CN"); // 等價於 DateFormat.getDateInstance( DateFormat.MEDIUM); DateFormat short0 = DateFormat.getDateInstance( ); DateFormat short1 = DateFormat.getDateInstance( DateFormat.SHORT); DateFormat medium1 = DateFormat.getDateInstance( DateFormat.MEDIUM); DateFormat long1 = DateFormat.getDateInstance( DateFormat.LONG); DateFormat full1 = DateFormat.getDateInstance( DateFormat.FULL); DateFormat short2 = DateFormat.getDateInstance( DateFormat.SHORT, locale); DateFormat medium2 = DateFormat.getDateInstance( DateFormat.MEDIUM, locale); DateFormat long2 = DateFormat.getDateInstance( DateFormat.LONG, locale); DateFormat full2 = DateFormat.getDateInstance( DateFormat.FULL, locale); System.out.println("\n----getDateInstance ----\n" + "(1.0) Empty Param : " + short0.format(date) +"\n" + "(2.1) One Param(s) : " + short1.format(date) +"\n" + "(2.2) One Param(m) : " + medium1.format(date) +"\n" + "(2.3) One Param(l) : " + long1.format(date) +"\n" + "(2.4) One Param(f) : " + full1.format(date) +"\n" + "(3.1) One Param(s,l): " + short2.format(date) +"\n" + "(3.2) One Param(m,l): " + medium2.format(date) +"\n" + "(3.3) One Param(l,l): " + long2.format(date) +"\n" + "(3.4) One Param(f,l): " + full2.format(date) +"\n" ); } /** * 測試DateFormat的format()函數 */ public static void testFormat() { Date date = new Date(); StringBuffer sb = new StringBuffer(); FieldPosition field = new FieldPosition(DateFormat.YEAR_FIELD); DateFormat format = DateFormat.getDateTimeInstance(); sb = format.format(date, sb, field); System.out.println("\ntestFormat"); System.out.printf("sb=%s\n", sb); } }
運轉成果:
----getTimeInstance ---- (1.0) Empty Param : 4:54:22 PM (2.1) One Param(s) : 4:54 PM (2.2) One Param(m) : 4:54:22 PM (2.3) One Param(l) : 4:54:22 PM CST (2.4) One Param(f) : 4:54:22 PM CST (3.1) One Param(s,l): 下晝4:54 (3.2) One Param(m,l): 16:54:22 (3.3) One Param(l,l): 下晝04時54分22秒 (3.4) One Param(f,l): 下晝04時54分22秒 CST ----getDateInstance ---- (1.0) Empty Param : Jan 23, 2014 (2.1) One Param(s) : 1/23/14 (2.2) One Param(m) : Jan 23, 2014 (2.3) One Param(l) : January 23, 2014 (2.4) One Param(f) : Thursday, January 23, 2014 (3.1) One Param(s,l): 14-1-23 (3.2) One Param(m,l): 2014-1-23 (3.3) One Param(l,l): 2014年1月23日 (3.4) One Param(f,l): 2014年1月23日 禮拜四 ----getDateTimeInstance ---- (1.0) Empty Param : Jan 23, 2014 4:54:23 PM (2.1) One Param(s) : 1/23/14 4:54 PM (2.2) One Param(m) : Jan 23, 2014 4:54:23 PM (2.3) One Param(l) : January 23, 2014 4:54:23 PM CST (2.4) One Param(f) : Thursday, January 23, 2014 4:54:23 PM CST (3.1) One Param(s,l): 14-1-23 下晝4:54 (3.2) One Param(m,l): 2014-1-23 16:54:23 (3.3) One Param(l,l): 2014年1月23日 下晝04時54分23秒 (3.4) One Param(f,l): 2014年1月23日 禮拜四 下晝04時54分23秒 CST testFormat sb=Jan 23, 2014 4:54:23 PM
OK。至此,對DateFormat的進修到此為止。接上去,我們開端進修SimpleDateFormat,它才是格局化Date須要重點懂得的。
SimpleDateFormat
1. 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);
2. SimpleDateFormat 相干格局解釋
2.1 日期和時光形式
日期和時光格局由日期和時光形式 字符串指定。在日期和時光形式字符串中,未加引號的字母 'A' 到 'Z' 和 'a' 到 'z' 被說明為形式字母,用來表現日期或時光字符串元素。文本可使用單引號 (') 惹起來,以避免停止說明。"''" 表現單引號。一切其他字符均不說明;只是在格局化時將它們簡略復制到輸入字符串,或許在解析時與輸出字符串停止婚配。
界說了以下形式字母(一切其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保存):
import java.util.Date; import java.util.Locale; import java.util.Calendar; import java.text.DateFormat; import java.text.SimpleDateFormat; /** * SimpleDateFormat 的API測試法式 * * @author skywang * @email [email protected] */ public class SimpleDateFormatTest { public static void main(String[] args) { // 經由過程SimpleDateFormat 獲得日期/時光:有多種格局 testSimpleDateFormats() ; // 經由過程DateFormat 獲得日期/時光 superTest() ; } /** * 經由過程SimpleDateFormat 獲得日期/時光。有多種格局可以選擇 */ private static void testSimpleDateFormats() { String[] formats = new String[] { "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 下晝, CST "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", // 禮拜四 2013-09-19 14:22:30 中國尺度時光 }; //Date date = (new Date(0)); // date為1970-01-01 07:00:00 //Date date = Calendar.getInstance().getTime(); // date為以後時光 Date date = new Date(113, 8, 19, 14, 22, 30); // date為2013-09-19 14:22:30 for (String format : formats) { SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.SIMPLIFIED_CHINESE); //SimpleDateFormat sdf = new SimpleDateFormat(format); System.out.format("%30s %s\n", format, sdf.format(date)); } } /** * 經由過程DateFormat 獲得日期/時光 */ private static void superTest() { // 新建date對象,時光是2013-09-19 14:22:30 // (01) 年=“‘目的年' - 1900”, // (02) 月。 0是一月,1是二月,順次類推。 // (03) 日。 1-31之間的數 Date mDate = new Date(113, 8, 19, 14, 22, 30); Locale locale = new Locale("zh", "CN"); // 14:22:30 String time = DateFormat.getTimeInstance( DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE).format(mDate); // 2013-09-19 String date = DateFormat.getDateInstance( DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE).format(mDate); // 2013-09-19 14:22:30 String datetime = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE).format(mDate); System.out.printf("\ntime=%s\ndate=%s\ndatetime=%s\n",time,date,datetime); } }
運轉成果:
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