7-日期、数字的格式化

使用 NumberFormat 格式化数字

抽象类 Format 有子类:MessageFormat、NumberFormat、DateFormatNumberFormat、DateFormat 可以将数值、日期转换成字符串,也可以将字符串转换成数值、日期。

NumberFormatDateFormat 类都包含了 format()parse() 方法,其中 format() 用于将 数值、日期 格式化成字符串,parse() 用于将字符串解析成数值、日期。

NumberFormat 是一个抽象基类,提供了如下几个类方法来得到对象:

  • getCurrencyInstance():返回默认 Locale 的货币格式器,也可以在调用该方法时传入指定的 Locale,则获取指定 Locale 的货币格式器。
  • getIntegerInstance():返回默认 Locale 的整数格式器,也可以在调用该方法时传入指定的 Locale,则获取指定 Locale 的货币格式器。
  • getNumberInstance():返回默认 Locale 的通用数值格式器,也可以在调用该方法时传入指定的 Locale,则获取指定 Locale 的货币格式器。
  • getPercentInstance():返回默认 Locale 的百分数格式器,也可以在调用该方法时传入指定的 Locale,则获取指定 Locale 的货币格式器。

一旦取得 NumberFormat 对象后,就可以调用它的 format() 方法来格式化数值,包括整数和浮点数。

使用 DateFormat 格式化日期、时间

DateFormat 也是一个抽象类,提供如下几个类方法用于获取 DateFormat 实例:

  • getDateInstance():返回一个日期格式器,它格式化后的字符串只有日期,没有时间。该方法可以传入多个参数,用于指定日期样式和 Locale 等参数,不指定就使用默认参数。
  • getTimeInstance():返回一个时间格式器,它格式化后的字符串只有时间,没有日期。该方法可以传入多个参数,用于指定日期样式和 Locale 等参数,不指定就使用默认参数。
  • getDateTimeInstance():返回一个日期、时间格式器,它格式化后的字符串既有日期,也有时间。该方法可以传入多个参数,用于指定日期样式、时间样式和 Locale 等参数,不指定就使用默认参数。

可以通过 DateFormat 的 4 个静态常量指定日期、时间样式:

  • FULL:例如 Friday,December 2,2018
  • LONG:例如 December 2,2018
  • MEDIUM:例如 Dec 2,2018
  • SHORT:例如 12/2/18
1
2
3
4
5
6
7
8
9
//需要被格式化的时间
Date dt = new Date();
//创建不同的日期格式器
DateFormat shortDf=DateFormat.getDateInstance(DateFormat.SHORT);
DateFormat fulltDf=DateFormat.getDateInstance(DateFormat.FULL);

//开始格式化
System.out.println(shortDf.format(dt));
System.out.pritnln(fullDf.format(dt));

获得了 DateFormat 对象之后,还可以调用它的 setLenient(boolean lenient) 方法类设置该格式器是否采用严格语法
DateFormat 的 parse() 方法可以把一个字符串解析成 Date 对象。

使用 SimpleDateFormat 格式化日期

SimpleDateFormat 是 DateFormat 的子类,创建 SimpleDateFormat 对象时需要传入一个 pattern 字符串,是一个日期模板字串,用来定制自己的日期格式。

1
2
3
4
5
//定制自己的日期格式
String pattern = "YYYY/MM/dd";
SimpleDateFormat dateFomat = new SimpleDateFormat(pattern);

System.out.println(dateFormat.format(new Date());

Java8 新增的日期、时间格式器

Java8 新增的日期、时间API里不仅包括了 Instant、LocalDate、LocalDateTime、LocalTime 等代表日期、时间的类,而且在 java.time.format 包下提供了一个 DateTimeFormatter 格式器类,该类相当于前面介绍的 DateFormatSimpleDateFormat 的合体,功能非常强大。

创建格式器实例

首先获取 DateTimeFormatter 对象,途径有:

  • 直接使用静态常量创建格式器:ISO_LOCAL_DATE、ISO_LOCAL_TIME、ISO_LOCAL_DATE_TIME 等静态常量,这些静态常量本身就是 DateTimeFormat 实例。
  • 使用代表不同风格的枚举值来创建格式器,在 FormatStyle 枚举类中定义了 FULL、LOGN、MEDIUM、SHORT 四个枚举值。
  • 根据模式字符串来创建格式器。

完成格式化

使用 DateTimeFormatter 把日期、时间格式化为字符串:

  • 调用 format(TemporalAccessor temporal) 方法执行格式化,LocalDate、LocalDateTime、LocalTime 等类都是 TemporalAccessor 接口的实现类。
  • 调用 LocalDate、LocalDateTime、LocalTime 等日期、时间对象的 format(DateTimeFormatter formatter) 方法执行格式化。

解析字符串

将指定格式的字符串解析成日期、时间对象,通过日期、时间对象提供的 parse(CharSequence text,DateTimeFormatter formatter) 方法进行解析。