天天看點

JAVA常用類之格式化

在之前的部落格中我們使用到了操作日期的一些類,我們發現,如果我們想要獲得指定格式的日期字元串可以做到但是很麻煩,下面為大家介紹幾種日期的格式化方式。

dateformat是日期/時間格式化子類的抽象類,它以與語言無關的方式格式化并解析日期或時間。日期/時間格式化子類(如 simpledateformat)允許進行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标準化。将日期表示為 date 對象,或者表示為從 gmt(格林尼治标準時間)1970 年 1 月 1 日 00:00:00 這一刻開始的毫秒數。

dateformat提供了很多類方法,以獲得基于預設或給定語言環境和多種格式化風格的預設日期/時間 formatter。格式化風格包括 full、long、medium和short。

dateformat可幫助進行格式化并解析任何語言環境的日期。對于月、星期,甚至月曆格式(陰曆和陽曆),其代碼可完全與語言環境的約定無關。

要格式化一個目前語言環境下的日期,可使用某個靜态工廠方法:

<code>mystring = dateformat.getdateinstance().format(mydate);</code>

如果格式化多個日期,那麼擷取該格式并多次使用它是更為高效的做法,這樣系統就不必多次擷取有關環境語言和國家/地區約定的資訊了。

要格式化不同語言環境的日期,可在getdateinstance()的調用中指定它。

<code>dateformat df = dateformat.getdateinstance(dateformat.long, locale.france);</code>

還可使用dateformat進行解析。

<code>mydate = df.parse(mystring);</code>

使用<code>getdateinstance</code>來擷取該國家/地區的标準日期格式。另外還提供了一些其他靜态工廠方法。使用 gettimeinstance 可擷取該國家/地區的時間格式。使用getdatetimeinstance 可擷取日期和時間格式。可以将不同選項傳入這些工廠方法,以控制結果的長度(從 short 到 medium 到 long 再到 full)。确切的結果取決于語言環境,但是通常:

short 完全為數字,如 12.13.52 或 3:30pm

medium 較長,如 jan 12, 1952

long 更長,如 january 12, 1952 或 3:30:32pm

full 是完全指定,如 tuesday、april 12、1952 ad 或 3:30:42pm pst

如果願意,還可以在格式上設定時區。如果想對格式化或解析施加更多的控制(或者給予使用者更多的控制),可以嘗試将從工廠方法所擷取的 dateformat 強制轉換為 simpledateformat。這适用于大多數國家/地區;隻是要記住将其放入一個 try 代碼塊中,以防遇到特殊的格式。

方法名

說明

protected dateformat()

建立一個新的 dateformat

傳回值

object

clone()

重寫 cloneable

boolean

equals(object obj)

重寫 equals

string

format(date date)

将一個 date 格式化為日期/時間字元串

abstract stringbuffer

format(date date, stringbuffer toappendto, fieldposition

fieldposition)

stringbuffer

format(object obj, stringbuffer toappendto, fieldposition fieldposition)

重寫 format

static locale[]

getavailablelocales()

傳回所有語言環境的數組,此類的 get*instance 方法可以為其傳回已本地化的執行個體

calendar

getcalendar()

擷取與此日期/時間格式器關聯的月曆

static

dateformat getdateinstance()

擷取日期格式器,該格式器具有預設語言環境的預設格式化風格

static dateformat

getdateinstance(int style)

擷取日期格式器,該格式器具有預設語言環境的給定格式化風格

getdateinstance(int style, locale alocale)

擷取日期格式器,該格式器具有給定語言環境的給定格式化風格

getdatetimeinstance()

擷取日期/時間格式器,該格式器具有預設語言環境的預設格式化風格

getdatetimeinstance(int datestyle, int timestyle)

擷取日期/時間格式器,該格式器具有預設語言環境的給定日期和時間格式化風格

getdatetimeinstance(int datestyle, int timestyle, locale alocale)

擷取日期/時間格式器,該格式器具有給定語言環境的給定格式化風格

getinstance()

擷取為日期和時間使用 short 風格的預設日期/時間格式器

numberformat

getnumberformat()

擷取此日期/時間格式器用于格式化和解析時間的數字格式器

gettimeinstance()

擷取時間格式器,該格式器具有預設語言環境的預設格式化風格

gettimeinstance(int style)

擷取時間格式器,該格式器具有預設語言環境的給定格式化風格

gettimeinstance(int style, locale alocale)

擷取時間格式器,該格式器具有給定語言環境的給定格式化風格

timezone

gettimezone()

擷取時區

int

hashcode()

重寫 hashcode

islenient()

判斷日期/時間解析是否為不嚴格的

date

parse(string source)

從給定字元串的開始解析文本,以生成一個日期

abstract date

parse(string source, parseposition pos)

根據給定的解析位置開始解析日期/時間字元串

parseobject(string source, parseposition pos)

解析字元串中的文本,以生成一個 date

void

setcalendar(calendar newcalendar)

設定此日期格式所使用的月曆

setlenient(boolean lenient)

指定日期/時間解析是否不嚴格

setnumberformat(numberformat newnumberformat)

允許使用者設定數字格式器

settimezone(timezone zone)

為此 dateformat 對象的月曆設定時區

運作結果(以實際為準):

2015-12-26

sat dec 26 00:00:00 cst 2015

21:49:37

thu jan 01 21:40:02 cst 1970

2015-12-26 21:49:37

sat dec 26 21:49:21 cst 2015

上面介紹的dateformat是日期格式化中最基本的方式,我們在實際應用開發中,使用最多的是simpledateformat,而非dateformat,simpledateformat更加便捷。

simpledateformat是一個以與語言環境有關的方式來格式化和解析日期的具體類。它允許進行格式化(日期 -&gt; 文本)、解析(文本 -&gt; 日期)和規範化。

simpledateformat使得可以選擇任何使用者定義的日期-時間格式的模式。可以根據需要使用 applypattern 方法來修改格式模式。

日期和時間格式由日期和時間模式字元串指定。在日期和時間模式字元串中,未加引号的字母 ‘a’ 到 ‘z’ 和 ‘a’ 到 ‘z’被解釋為模式字母,用來表示日期或時間字元串元素。文本可以使用單引号 (‘)引起來,以免進行解釋。”””表示單引号。所有其他字元均不解釋;隻是在格式化時将它們簡單複制到輸出字元串,或者在解析時與輸入字元串進行比對。

定義了以下模式字母(所有其他字元 ‘a’ 到 ‘z’ 和 ‘a’ 到 ‘z’ 都被保留):

字母

日期或時間元素

表示

示例

g

era

标志符

text

y

year

1996;

m

年中的月份

month

july; jul; 07

w

年中的周數

number

27

月份中的周數

2

d

年中的天數

189

月份中的天數

10

f

月份中的星期

e

星期中的天數

tuesday; tue

a

am/pm 标記

pm

h

一天中的小時數(0-23)

k

一天中的小時數(1-24)

24

am/pm 中的小時數(0-11)

am/pm 中的小時數(1-12)

12

小時中的分鐘數

30

s

分鐘中的秒數

55

毫秒數

978

z

時區

general time zone

pacific standard time; pst; gmt-08:00

rfc 822 time zone

-0800

simpledateformat()

用預設的模式和預設語言環境的日期格式符号構造 simpledateformat

simpledateformat(string pattern)

用給定的模式和預設語言環境的日期格式符号構造 simpledateformat

simpledateformat(string pattern, dateformatsymbols formatsymbols)

用給定的模式和日期符号構造 simpledateformat

simpledateformat(string pattern, locale locale)

用給定的模式和給定語言環境的預設日期格式符号構造 simpledateformat

applylocalizedpattern(string pattern)

将給定的本地化模式字元串應用于此日期格式

applypattern(string pattern)

将給定模式字元串應用于此日期格式

建立此 simpledateformat 的一個副本

比較給定對象與此 simpledateformat 的相等性

format(date date, stringbuffer toappendto, fieldposition pos)

将給定的 date 格式化為日期/時間字元串,并将結果添加到給定的 stringbuffer

attributedcharacteriterator

formattocharacteriterator(object obj)

格式化生成 attributedcharacteriterator 的對象

get2digityearstart()

傳回在 100 年周期内被解釋的兩位數字年份的開始日期

dateformatsymbols

getdateformatsymbols()

擷取此日期格式的日期和時間格式符号的一個副本

傳回此 simpledateformat 對象的哈希碼值

parse(string text, parseposition pos)

解析字元串的文本,生成 date

set2digityearstart(date startdate)

設定 100 年周期的兩位數年份,該年份将被解釋為從使用者指定的日期開始

setdateformatsymbols(dateformatsymbols newformatsymbols)

設定此日期格式的日期和時間格式符号

tolocalizedpattern()

傳回描述此日期格式的本地化模式字元串

topattern()

傳回描述此日期格式的模式字元串

2015-12-26 22:04:55

sat dec 26 22:04:55 cst 2015

numberformat是所有數值格式的抽象基類。此類提供格式化和解析數值的接口。numberformat還提供了一些方法來确定哪些語言環境具有數值格式,以及它們的名稱是什麼。

numberformat可用于格式化和解析任何語言環境的數值。使代碼能夠完全獨立于小數點、千位分隔符甚至所用特定小數位數的語言環境約定,并與數值格式是否為偶小數無關。

protected numberformat()

唯一的構造方法

format(double number)

格式規範

abstract stringbuffer

format(double number, stringbuffer toappendto, fieldposition pos)

format(long number)

format(long number, stringbuffer toappendto, fieldposition pos)

format(object number, stringbuffer toappendto, fieldposition pos)

格式化一個數并将所得文本添加到給定字元串緩沖區

傳回一個數組,它包含所有此類的 get*instance 方法可以為其傳回本地化執行個體的語言環境

currency

getcurrency()

擷取格式化貨币值時此數值格式使用的貨币

static numberformat

getcurrencyinstance()

傳回目前預設語言環境的貨币格式

getcurrencyinstance(locale inlocale)

傳回指定語言環境的貨币格式

傳回目前預設語言環境的通用數值格式

getinstance(locale inlocale)

傳回指定語言環境的通用數值格式

getintegerinstance()

傳回目前預設語言環境的整數格式

getintegerinstance(locale inlocale)

傳回指定語言環境的整數格式

getmaximumfractiondigits()

傳回數的小數部分所允許的最大位數

getmaximumintegerdigits()

傳回數的整數部分所允許的最大位數

getminimumfractiondigits()

傳回數的小數部分所允許的最小位數

getminimumintegerdigits()

傳回數的整數部分所允許的最小位數

getnumberinstance()

getnumberinstance(locale inlocale)

getpercentinstance()

傳回目前預設語言環境的百分比格式

getpercentinstance(locale inlocale)

傳回指定語言環境的百分比格式

roundingmode

getroundingmode()

擷取在此 numberformat 中使用的 roundingmode

isgroupingused()

如果此格式中使用了分組,則傳回 true

isparseintegeronly()

如果此格式隻将數作為整數解析,則傳回 true

解析給定字元串開頭的文本,生成一個數值

abstract number

parse(string source, parseposition parseposition)

如果可能則傳回 long (例如,在 [long.min_value, long.max_value] 範圍内且沒有小數),否則傳回 double

解析字元串中的文本,以生成一個 number

setcurrency(currency currency)

設定格式化貨币值時此數值格式使用的貨币

setgroupingused(boolean newvalue)

設定此格式中是否使用分組

setmaximumfractiondigits(int newvalue)

設定數的小數部分所允許的最大位數

setmaximumintegerdigits(int newvalue)

設定數的整數部分所允許的最大位數

setminimumfractiondigits(int newvalue)

設定數的小數部分所允許的最小位數

setminimumintegerdigits(int newvalue)

設定數的整數部分所允許的最小位數

setparseintegeronly(boolean value)

設定數是否應該僅作為整數進行解析

setroundingmode(roundingmode roundingmode)

設定在此 numberformat 中使用的 roundingmode

運作結果:

¥0.51

1

0.512

51%

decimalformat與numberformat的關系就好像simpledateformat與dateformat之間的關系。

decimalformat 是 numberformat 的一個具體子類,用于格式化十進制數字。該類設計有各種功能,使其能夠解析和格式化任意語言環境中的數,包括對西方語言、阿拉伯語和印度語數字的支援。它還支援不同類型的數,包括整數 (123)、定點數 (123.4)、科學記數法表示的數 (1.23e4)、百分數 (12%) 和金額 ($123)。所有這些内容都可以本地化。

特殊模式字元

模式中的很多字元都是按字面解釋的;在解析期間對其進行比對,在格式化期間則不經改變地輸出。另一方面,特殊字元代表了其他字元、字元串或字元類。如果要将其作為字面量出現在字首或字尾中,那麼除非另行說明,否則必須對其加引号。

下列字元用在非本地化的模式中。已本地化的模式使用從此格式器的 decimalformatsymbols 對象中獲得的相應字元,這些字元已失去其特殊狀态。兩種例外是貨币符号和引号,不将其本地化。

符号

位置

本地化?

含義

數字

阿拉伯數字

#

阿拉伯數字,如果不存在則顯示為 0

.

小數分隔符或貨币小數分隔符

-

減号

,

分組分隔符

分隔科學計數法中的尾數和指數。在字首或字尾中無需加引号

;

子模式邊界

分隔正數和負數子模式

%

字首或字尾

乘以 100 并顯示為百分數

\u2030

乘以 1000 并顯示為千分數

¤ (\u00a4)

貨币記号,由貨币符号替換。如果兩個同時出現,則用國際貨币符号替換。如果出現在某個模式中,則使用貨币小數分隔符,而不使用小數分隔符

用于在字首或或字尾中為特殊字元加引号,例如 “’#’#” 将 123 格式化為 “#123”。要建立單引号本身,請連續使用兩個單引号:”# o”clock”

科學計數法

科學計數法中的數表示為一個尾數和一個 10 的幾次幂的乘積,例如可将 1234 表示為 1.234 x 10^3。尾數的範圍通常是 1.0 &lt;= x &lt; 10.0,但并非必需如此。可訓示 decimalformat 僅通過某個模式 來格式化和解析科學計數法表示的數;目前沒有建立科學計數法格式的工廠方法。在這個模式中,指數字元後面緊跟着一個或多個數字字元即訓示科學計數法。示例:”0.###e0” 将數字 1234 格式化為 “1.234e3”。

指數字元後面的數字位數字元數給出了最小的指數位數。沒有最大值。使用本地化的減号來格式化負數指數,不 使用模式中的字首和字尾。這就允許存在諸如 “0.###e0 m/s” 等此類的模式。

最小和最大整數數字位數一起進行解釋:

如果最大整數數字位數大于其最小整數數字位數并且大于 1,則強制要求指數為最大整數數字位數的倍數,并将最小整數數字位數解釋為 1。最常見的用法是生成工程計數法,其中指數是 3 的倍數,如 “##0.#####e0”。使用此模式時,數 12345 格式化為 “12.345e3”,123456 則格式化為 “123.456e3”。

否則通過調整指數來得到最小整數數字位數。示例:使用 “00.###e0” 格式化 0.00123 時得到 “12.3e-4”。

尾數中的有效位數是最小整數 和最大小數 位數的和,不受最大整數位數的影響。例如,使用 “##0.##e0” 格式化 12345 得到 “12.3e3”。要顯示所有位數,請将有效位數計數設定為零。有效位數不會影響解析。

數模式可能不包含分組分隔符。

舍入

decimalformat 提供 roundingmode 中定義的舍入模式進行格式化。預設情況下,它使用 roundingmode.half_even。

為了進行格式化,decimalformat 使用 decimalformatsymbols 對象中所定義的、從已本地化的阿拉伯數字 0 開始的 10 個連續字元作為阿拉伯數字。為了進行解析,可識别 character.digit 所定義的這些阿拉伯數字和所有 unicode 十進制阿拉伯數字。

特殊值

nan 被格式化為一個字元串,通常具有單個字元 \ufffd。此字元串由 decimalformatsymbols 對象所确定。這是唯一不使用字首和字尾的值。

無窮大的值被格式化為一個字元串,通常具有單個字元 \u221e,具有正數或負數字首和字尾。無窮大值的字元串由 decimalformatsymbols 對象所确定。

将負零(”-0”)解析為:

如果 isparsebigdecimal() 為 true,則為 bigdecimal(0),

如果 isparsebigdecimal() 為 false 并且 isparseintegeronly() 為 true,則為 long(0),

如果 isparsebigdecimal() 和 isparseintegeronly() 均為 false,則為 double(-0.0)。

decimalformat()

使用預設模式和預設語言環境的符号建立一個 decimalformat

decimalformat(string pattern)

使用給定的模式和預設語言環境的符号建立一個 decimalformat

decimalformat(string pattern, decimalformatsymbols symbols)

使用給定的模式和符号建立一個 decimalformat。

将給定的模式應用于此 format 對象

标準重寫;沒有語義上的變化

format(double number, stringbuffer result, fieldposition fieldposition)

格式化一個 double 值,以生成一個字元串

format(long number, stringbuffer result, fieldposition fieldposition)

格式化一個 long 值,以生成一個字元串

格式化一個數,并将所得文本追加到給定的字元串緩沖區

格式化一個 object,以生成一個 attributedcharacteriterator

擷取格式化貨币值時,此十進制格式使用的貨币

decimalformatsymbols

getdecimalformatsymbols()

傳回小數格式符号的一個副本,通常程式員或使用者不改變此副本

getgroupingsize()

傳回分組大小

擷取某個數的小數部分中所允許的最大數字位數

擷取某個數的整數部分中所允許的最大數字位數

擷取某個數的小數部分中所允許的最小數字位數

擷取某個數的整數部分中所允許的最小數字位數

getmultiplier()

擷取百分數、千分數和類似格式中使用的乘數

getnegativeprefix()

擷取負數字首

getnegativesuffix()

擷取負數字尾

getpositiveprefix()

擷取正數字首

getpositivesuffix()

擷取正數字尾

擷取在此 decimalformat 中使用的 roundingmode

isdecimalseparatoralwaysshown()

允許擷取整數中小數分隔符的行為

isparsebigdecimal()

傳回 parse(java.lang.string, java.text.parseposition) 方法是否傳回 bigdecimal

設定格式化貨币值時,此數字格式使用的貨币

setdecimalformatsymbols(decimalformatsymbols newsymbols)

設定小數格式符号,通常程式員或使用者不改變此符号

setdecimalseparatoralwaysshown(boolean newvalue)

允許設定整數中小數分隔符的行為

setgroupingsize(int newvalue)

設定分組大小

設定某個數的小數部分中所允許的最大數字位數

設定某個數字的整數部分中所允許的最大數字位數

設定某個數的小數部分中所允許的最小數字位數

設定某個數字的整數部分中所允許的最小數字位數

setmultiplier(int newvalue)

設定百分數、千分數和類似格式中使用的乘數

setnegativeprefix(string newvalue)

設定負數字首

setnegativesuffix(string newvalue)

設定負數字尾

setparsebigdecimal(boolean newvalue)

設定 parse(java.lang.string, java.text.parseposition) 方法是否傳回 bigdecimal

setpositiveprefix(string newvalue)

設定正數字首

setpositivesuffix(string newvalue)

設定正數字尾

設定在此 decimalformat 中使用的 roundingmode

合成一個表示此 format 對象目前狀态的、已本地化的模式字元串

合成一個表示此 format 對象目前狀态的模式字元串

00.510