第十一篇:JAVA常用类之格式化

来源:互联网 发布:高瓴资本集团大数据 编辑:程序博客网 时间:2024/06/01 22:26

日期格式化

在之前的博客中我们使用到了操作日期的一些类,我们发现,如果我们想要获得指定格式的日期字符串可以做到但是很麻烦,下面为大家介绍几种日期的格式化方式。

java.text.DateFormat

DateFormat是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年 1 月 1 日 00:00:00 这一刻开始的毫秒数。 
DateFormat提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间 Formatter。格式化风格包括 FULL、LONG、MEDIUM和SHORT。 
DateFormat可帮助进行格式化并解析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历),其代码可完全与语言环境的约定无关。 
要格式化一个当前语言环境下的日期,可使用某个静态工厂方法: 
myString = DateFormat.getDateInstance().format(myDate); 
如果格式化多个日期,那么获取该格式并多次使用它是更为高效的做法,这样系统就不必多次获取有关环境语言和国家/地区约定的信息了。

DateFormat df = DateFormat.getDateInstance();for (int i = 0; i < myDate.length; ++i) {   output.println(df.format(myDate[i]) + "; ");}

要格式化不同语言环境的日期,可在getDateInstance()的调用中指定它。 
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE); 
还可使用DateFormat进行解析。 
myDate = df.parse(myString); 
使用getDateInstance来获取该国家/地区的标准日期格式。另外还提供了一些其他静态工厂方法。使用 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

方法摘要

返回值方法名说明Objectclone()重写 Cloneablebooleanequals(Object obj)重写 equalsStringformat(Date date)将一个 Date 格式化为日期/时间字符串abstract StringBufferformat(Date date, StringBuffer toAppendTo, FieldPositionfieldPosition)StringBufferformat(Object obj, StringBuffer toAppendTo, FieldPosition fieldPosition)重写 Formatstatic Locale[]getAvailableLocales()返回所有语言环境的数组,此类的 get*Instance 方法可以为其返回已本地化的实例CalendargetCalendar()获取与此日期/时间格式器关联的日历staticDateFormat getDateInstance()获取日期格式器,该格式器具有默认语言环境的默认格式化风格static DateFormatgetDateInstance(int style)获取日期格式器,该格式器具有默认语言环境的给定格式化风格static DateFormatgetDateInstance(int style, Locale aLocale)获取日期格式器,该格式器具有给定语言环境的给定格式化风格static DateFormatgetDateTimeInstance()获取日期/时间格式器,该格式器具有默认语言环境的默认格式化风格static DateFormatgetDateTimeInstance(int dateStyle, int timeStyle)获取日期/时间格式器,该格式器具有默认语言环境的给定日期和时间格式化风格static DateFormatgetDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale)获取日期/时间格式器,该格式器具有给定语言环境的给定格式化风格static DateFormatgetInstance()获取为日期和时间使用 SHORT 风格的默认日期/时间格式器NumberFormatgetNumberFormat()获取此日期/时间格式器用于格式化和解析时间的数字格式器static DateFormatgetTimeInstance()获取时间格式器,该格式器具有默认语言环境的默认格式化风格static DateFormatgetTimeInstance(int style)获取时间格式器,该格式器具有默认语言环境的给定格式化风格static DateFormatgetTimeInstance(int style, Locale aLocale)获取时间格式器,该格式器具有给定语言环境的给定格式化风格TimeZonegetTimeZone()获取时区inthashCode()重写 hashCodebooleanisLenient()判断日期/时间解析是否为不严格的Dateparse(String source)从给定字符串的开始解析文本,以生成一个日期abstract Dateparse(String source, ParsePosition pos)根据给定的解析位置开始解析日期/时间字符串ObjectparseObject(String source, ParsePosition pos)解析字符串中的文本,以生成一个 DatevoidsetCalendar(Calendar newCalendar)设置此日期格式所使用的日历voidsetLenient(boolean lenient)指定日期/时间解析是否不严格voidsetNumberFormat(NumberFormat newNumberFormat)允许用户设置数字格式器voidsetTimeZone(TimeZone zone)为此 DateFormat 对象的日历设置时区

使用示例

import java.text.DateFormat;import java.text.ParseException;import java.util.Date;public class DateFormatDemo{   public static void main(String[] args) throws ParseException   {      // 获取日期格式器,该格式器具有默认语言环境的默认格式化风格      DateFormat dateFormat = DateFormat.getDateInstance();      // 格式化当前时间      System.out.println(dateFormat.format(new Date()));      // 解析字符串为时间      System.out.println(dateFormat.parse("2015-12-26"));      // 获取时间格式器,该格式器具有默认语言环境的默认格式化风格。      DateFormat timeFormat = DateFormat.getTimeInstance();      // 格式化当前时间      System.out.println(timeFormat.format(new Date()));      // 解析字符串为时间      System.out.println(timeFormat.parse("21:40:02"));   }}

运行结果(以实际为准): 
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

java.text.SimpleDateFormat

上面介绍的DateFormat是日期格式化中最基本的方式,我们在实际应用开发中,使用最多的是SimpleDateFormat,而非DateFormat,SimpleDateFormat更加便捷。 
SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。 
SimpleDateFormat使得可以选择任何用户定义的日期-时间格式的模式。可以根据需要使用 applyPattern 方法来修改格式模式。 
日期和时间格式由日期和时间模式字符串指定。在日期和时间模式字符串中,未加引号的字母 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (‘)引起来,以免进行解释。”””表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。 
定义了以下模式字母(所有其他字符 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’ 都被保留):

字母日期或时间元素表示示例GEra标志符Texty年Year1996;M年中的月份MonthJuly; Jul; 07w年中的周数Number27W月份中的周数Number2D年中的天数Number189d月份中的天数Number10F月份中的星期Number2E星期中的天数TextTuesday; TueaAm/pm 标记TextPMH一天中的小时数(0-23)Number0k一天中的小时数(1-24)Number24Kam/pm 中的小时数(0-11)Number0ham/pm 中的小时数(1-12)Number12m小时中的分钟数Number30s分钟中的秒数Number55S毫秒数Number978z时区General time zonePacific Standard Time; PST; GMT-08:00Z时区RFC 822 time zone-0800

构造方法

方法名说明SimpleDateFormat()用默认的模式和默认语言环境的日期格式符号构造 SimpleDateFormatSimpleDateFormat(String pattern)用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormatSimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)用给定的模式和日期符号构造 SimpleDateFormatSimpleDateFormat(String pattern, Locale locale)用给定的模式和给定语言环境的默认日期格式符号构造 SimpleDateFormat

方法摘要

返回值方法名说明voidapplyLocalizedPattern(String pattern)将给定的本地化模式字符串应用于此日期格式voidapplyPattern(String pattern)将给定模式字符串应用于此日期格式Objectclone()创建此 SimpleDateFormat 的一个副本booleanequals(Object obj)比较给定对象与此 SimpleDateFormat 的相等性StringBufferformat(Date date, StringBuffer toAppendTo, FieldPosition pos)将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBufferAttributedCharacterIteratorformatToCharacterIterator(Object obj)格式化生成 AttributedCharacterIterator 的对象Dateget2DigitYearStart()返回在 100 年周期内被解释的两位数字年份的开始日期DateFormatSymbolsgetDateFormatSymbols()获取此日期格式的日期和时间格式符号的一个副本inthashCode()返回此 SimpleDateFormat 对象的哈希码值Dateparse(String text, ParsePosition pos)解析字符串的文本,生成 Datevoidset2DigitYearStart(Date startDate)设置 100 年周期的两位数年份,该年份将被解释为从用户指定的日期开始voidsetDateFormatSymbols(DateFormatSymbols newFormatSymbols)设置此日期格式的日期和时间格式符号StringtoLocalizedPattern()返回描述此日期格式的本地化模式字符串StringtoPattern()返回描述此日期格式的模式字符串

使用示例

import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class SimpleDateFormatDemo{   public static void main(String[] args) throws ParseException   {      // 获得当前时间      Date now = new Date();      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      // 格式化当前时间      System.out.println(dateFormat.format(now));      // 解析      System.out.println(dateFormat.parse("2015-12-26 22:04:55"));   }}

运行结果(以实际为准): 
2015-12-26 22:04:55 
Sat Dec 26 22:04:55 CST 2015

数值格式化

java.text.NumberFormat

NumberFormat是所有数值格式的抽象基类。此类提供格式化和解析数值的接口。NumberFormat还提供了一些方法来确定哪些语言环境具有数值格式,以及它们的名称是什么。 
NumberFormat可用于格式化和解析任何语言环境的数值。使代码能够完全独立于小数点、千位分隔符甚至所用特定小数位数的语言环境约定,并与数值格式是否为偶小数无关。

构造方法

方法名说明protected NumberFormat()唯一的构造方法

方法摘要

返回值方法名说明Objectclone()重写 Cloneablebooleanequals(Object obj)重写 equalsStringformat(double number)格式规范abstract StringBufferformat(double number, StringBuffer toAppendTo, FieldPosition pos)格式规范Stringformat(long number)格式规范abstract StringBufferformat(long number, StringBuffer toAppendTo, FieldPosition pos)格式规范StringBufferformat(Object number, StringBuffer toAppendTo, FieldPosition pos)格式化一个数并将所得文本添加到给定字符串缓冲区static Locale[]getAvailableLocales()返回一个数组,它包含所有此类的 get*Instance 方法可以为其返回本地化实例的语言环境CurrencygetCurrency()获取格式化货币值时此数值格式使用的货币static NumberFormatgetCurrencyInstance()返回当前默认语言环境的货币格式static NumberFormatgetCurrencyInstance(Locale inLocale)返回指定语言环境的货币格式static NumberFormatgetInstance()返回当前默认语言环境的通用数值格式static NumberFormatgetInstance(Locale inLocale)返回指定语言环境的通用数值格式static NumberFormatgetIntegerInstance()返回当前默认语言环境的整数格式static NumberFormatgetIntegerInstance(Locale inLocale)返回指定语言环境的整数格式intgetMaximumFractionDigits()返回数的小数部分所允许的最大位数intgetMaximumIntegerDigits()返回数的整数部分所允许的最大位数intgetMinimumFractionDigits()返回数的小数部分所允许的最小位数intgetMinimumIntegerDigits()返回数的整数部分所允许的最小位数static NumberFormatgetNumberInstance()返回当前默认语言环境的通用数值格式static NumberFormatgetNumberInstance(Locale inLocale)返回指定语言环境的通用数值格式static NumberFormatgetPercentInstance()返回当前默认语言环境的百分比格式static NumberFormatgetPercentInstance(Locale inLocale)返回指定语言环境的百分比格式RoundingModegetRoundingMode()获取在此 NumberFormat 中使用的 RoundingModeinthashCode()重写 hashCodebooleanisGroupingUsed()如果此格式中使用了分组,则返回 truebooleanisParseIntegerOnly()如果此格式只将数作为整数解析,则返回 trueNumberparse(String source)解析给定字符串开头的文本,生成一个数值abstract Numberparse(String source, ParsePosition parsePosition)如果可能则返回 Long (例如,在 [Long.MIN_VALUE, Long.MAX_VALUE] 范围内且没有小数),否则返回 DoubleObjectparseObject(String source, ParsePosition pos)解析字符串中的文本,以生成一个 NumbervoidsetCurrency(Currency currency)设置格式化货币值时此数值格式使用的货币voidsetGroupingUsed(boolean newValue)设置此格式中是否使用分组voidsetMaximumFractionDigits(int newValue)设置数的小数部分所允许的最大位数voidsetMaximumIntegerDigits(int newValue)设置数的整数部分所允许的最大位数voidsetMinimumFractionDigits(int newValue)设置数的小数部分所允许的最小位数voidsetMinimumIntegerDigits(int newValue)设置数的整数部分所允许的最小位数voidsetParseIntegerOnly(boolean value)设置数是否应该仅作为整数进行解析voidsetRoundingMode(RoundingMode roundingMode)设置在此 NumberFormat 中使用的 RoundingMode

使用示例

import java.text.NumberFormat;import java.text.ParseException;public class NumberFormatDemo{   public static void main(String[] args) throws ParseException   {      double d = 0.51234;      // 当前默认语言环境的货币格式      NumberFormat currency = NumberFormat.getCurrencyInstance();      System.out.println(currency.format(d));      // 当前默认语言环境的整数格式      NumberFormat integer = NumberFormat.getIntegerInstance();      System.out.println(integer.format(d));      // 当前默认语言环境的通用数值格式      NumberFormat number = NumberFormat.getNumberInstance();      System.out.println(number.format(d));      // 当前默认语言环境的百分比格式      NumberFormat percent = NumberFormat.getPercentInstance();      System.out.println(percent.format(d));   }}

运行结果: 
¥0.51 

0.512 
51%

java.text.DecimalFormat

DecimalFormat与NumberFormat的关系就好像SimpleDateFormat与DateFormat之间的关系。 
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。

  • 特殊模式字符 
    模式中的很多字符都是按字面解释的;在解析期间对其进行匹配,在格式化期间则不经改变地输出。另一方面,特殊字符代表了其他字符、字符串或字符类。如果要将其作为字面量出现在前缀或后缀中,那么除非另行说明,否则必须对其加引号。 
    下列字符用在非本地化的模式中。已本地化的模式使用从此格式器的 DecimalFormatSymbols 对象中获得的相应字符,这些字符已失去其特殊状态。两种例外是货币符号和引号,不将其本地化。
符号位置本地化?含义0数字是阿拉伯数字#数字是阿拉伯数字,如果不存在则显示为 0.数字是小数分隔符或货币小数分隔符-数字是减号,数字是分组分隔符E数字是分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号;子模式边界是分隔正数和负数子模式%前缀或后缀是乘以 100 并显示为百分数\u2030前缀或后缀是乘以 1000 并显示为千分数¤ (\u00A4)前缀或后缀否货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符‘前缀或后缀否用于在前缀或或后缀中为特殊字符加引号,例如 “’#’#” 将 123 格式化为 “#123”。要创建单引号本身,请连续使用两个单引号:”# o”clock”
  • 科学计数法 
    科学计数法中的数表示为一个尾数和一个 10 的几次幂的乘积,例如可将 1234 表示为 1.234 x 10^3。尾数的范围通常是 1.0 <= x < 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()使用默认模式和默认语言环境的符号创建一个 DecimalFormatDecimalFormat(String pattern)使用给定的模式和默认语言环境的符号创建一个 DecimalFormatDecimalFormat(String pattern, DecimalFormatSymbols symbols)使用给定的模式和符号创建一个 DecimalFormat。

方法摘要

返回值方法名说明voidapplyLocalizedPattern(String pattern)将给定的模式应用于此 Format 对象voidapplyPattern(String pattern)将给定的模式应用于此 Format 对象Objectclone()标准重写;没有语义上的变化booleanequals(Object obj)重写 equalsStringBufferformat(double number, StringBuffer result, FieldPosition fieldPosition)格式化一个 double 值,以生成一个字符串StringBufferformat(long number, StringBuffer result, FieldPosition fieldPosition)格式化一个 long 值,以生成一个字符串StringBufferformat(Object number, StringBuffer toAppendTo, FieldPosition pos)格式化一个数,并将所得文本追加到给定的字符串缓冲区AttributedCharacterIteratorformatToCharacterIterator(Object obj)格式化一个 Object,以生成一个 AttributedCharacterIteratorCurrencygetCurrency()获取格式化货币值时,此十进制格式使用的货币DecimalFormatSymbolsgetDecimalFormatSymbols()返回小数格式符号的一个副本,通常程序员或用户不改变此副本intgetGroupingSize()返回分组大小intgetMaximumFractionDigits()获取某个数的小数部分中所允许的最大数字位数intgetMaximumIntegerDigits()获取某个数的整数部分中所允许的最大数字位数intgetMinimumFractionDigits()获取某个数的小数部分中所允许的最小数字位数intgetMinimumIntegerDigits()获取某个数的整数部分中所允许的最小数字位数intgetMultiplier()获取百分数、千分数和类似格式中使用的乘数StringgetNegativePrefix()获取负数前缀StringgetNegativeSuffix()获取负数后缀StringgetPositivePrefix()获取正数前缀StringgetPositiveSuffix()获取正数后缀RoundingModegetRoundingMode()获取在此 DecimalFormat 中使用的 RoundingModeinthashCode()重写 hashCodebooleanisDecimalSeparatorAlwaysShown()允许获取整数中小数分隔符的行为booleanisParseBigDecimal()返回 parse(java.lang.String, java.text.ParsePosition) 方法是否返回 BigDecimalNumberparse(String text, ParsePosition pos)解析字符串中的文本,以生成一个 NumbervoidsetCurrency(Currency currency)设置格式化货币值时,此数字格式使用的货币voidsetDecimalFormatSymbols(DecimalFormatSymbols newSymbols)设置小数格式符号,通常程序员或用户不改变此符号voidsetDecimalSeparatorAlwaysShown(boolean newValue)允许设置整数中小数分隔符的行为voidsetGroupingSize(int newValue)设置分组大小voidsetMaximumFractionDigits(int newValue)设置某个数的小数部分中所允许的最大数字位数voidsetMaximumIntegerDigits(int newValue)设置某个数字的整数部分中所允许的最大数字位数voidsetMinimumFractionDigits(int newValue)设置某个数的小数部分中所允许的最小数字位数voidsetMinimumIntegerDigits(int newValue)设置某个数字的整数部分中所允许的最小数字位数voidsetMultiplier(int newValue)设置百分数、千分数和类似格式中使用的乘数voidsetNegativePrefix(String newValue)设置负数前缀voidsetNegativeSuffix(String newValue)设置负数后缀voidsetParseBigDecimal(boolean newValue)设置 parse(java.lang.String, java.text.ParsePosition) 方法是否返回 BigDecimalvoidsetPositivePrefix(String newValue)设置正数前缀voidsetPositiveSuffix(String newValue)设置正数后缀voidsetRoundingMode(RoundingMode roundingMode)设置在此 DecimalFormat 中使用的 RoundingModeStringtoLocalizedPattern()合成一个表示此 Format 对象当前状态的、已本地化的模式字符串StringtoPattern()合成一个表示此 Format 对象当前状态的模式字符串

使用示例

import java.text.DecimalFormat;import java.text.ParseException;public class DecimalFormatDemo{   public static void main(String[] args) throws ParseException   {      double d = 0.51;      DecimalFormat format1 = new DecimalFormat("00.000");      System.out.println(format1.format(d));      DecimalFormat format2 = new DecimalFormat("#0.000");      System.out.println(format2.format(d));      DecimalFormat format3 = new DecimalFormat("0.###");      System.out.println(format3.format(d));   }}

运行结果: 
00.510 
0.510 
0.51

原创粉丝点击