之所以在国际化中介绍DateFormat和NumberFormat这两个类,一是因为本身这两个类是地区敏感类,即可用传入Locale对象;二是因为这两个类具有不同的输出模式,而这些模式能在国际化的动态数据显示MessageFormat的占位符中使用到(在下一篇博客中介绍)。
我们先来看看DateFormat。
DateFormat和SimpleDateFormat拥有类似的功能,但是一般我们会用SimpleDateFormat比较多,这是因为使用SimpleDateFormat能按自己制定很细的日期格式,同时也支持Locale对象,当然本篇中我们只介绍DateFormat。
DateFormat类可以将一个日期/时间类(例如Date类)的对象格式化为表示某地区或语言环境的日期/时间字符串,当然也能从字符串转换为日期/时间类。
DateFormat类具有一些表示日期/时间显示格式的整型常量,这些常量也是我们刚才说过的MessageFormat占位符中可以使用到的模式,这些常量有:
SHORT、MEDIUM(同时也是默认格式)、LONG、FULL这几种。分别表示了输出日期格式的详细程度。
DateFormat最终将一个日期/时间对象输出到字符串显示的格式会被三个因素影响,一是获取DateFormat实例对象的方法,二是该方法中指定的Locale对象,三是上面提到的4种日期长度格式常量。
我们看看DateFormat能获取实例对象的方法:
① getDateInstance方法,只获取日期的实例对象
② getTimeInstance方法,只获取时间的实例对象
③ getDateTimeInstance方法,获取日期和时间的实例对象
对上面的每个方法,有无参的(长度模式和Locale都采用默认值),有单独参数的(指定长度模式),有两个参数的(指定长度模式和Locale对象)共九种方法。
下面我们通过示例来看看每种长度模式的常量会使日期或时间显示出什么样的格式,以下getDateInstance方法中我省略了Locale对象,这样每个方法都会按照我本地语言环境,也就是中文环境:
例1-1:
1 Date date = new Date();2 3 DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);4 String dateStr = df.format(date);5 System.out.println(dateStr);
只获取日期,长度模式为MEDIUM,输出:2016-1-9
例1-2:
1 Date date = new Date();2 3 DateFormat df = DateFormat.getDateInstance(DateFormat.FULL);4 String dateStr = df.format(date);5 System.out.println(dateStr);
只获取日期,长度模式为FULL,输出:2016年1月9日 星期六
例1-3:
1 Date date = new Date();2 3 DateFormat df = DateFormat.getTimeInstance(DateFormat.LONG);4 String dateStr = df.format(date);5 System.out.println(dateStr);
只获取时间,长度模式为FULL,输出:下午04时33分17秒。
当然是用DateFormat还能将一个字符串转换为日期/时间对象,但是用的时候一定要注意:字符串中日期的格式一定要满足DateFormat的四种长度模式常量指定的格式,并且在使用DateFormat方法时也要指定字符串中日期或时间使用的是哪种格式。
例1-4:
1 String dateStr = "2016-1-9 16:39:27";2 3 DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);4 Date date = df.parse(dateStr);5 System.out.println(date);
将字符串转换为Date对象,getDateTimeInstance方法中必须要指明字符串中日期的采用的格式才能转换成功。当然如果我们只想获取该字符串中的日期或时间,只需要使用getDateInstance方法或getTimeInstance方法即可,但也必须要指明格式。
附:DateFormat非线程安全,因此每个线程都应该创建自己的DateFormat实例对象。
DateFormat类的基本用法就如上所示。我们现在来看看NumberFormat类。
对于NumberFormat类的getNumberInstance方法和getIntegerInstance方法也有format方法和parse方法,format方法将一个基本类型的数字转换为字符串,而parse方法将一个字符串转换为Number类型(Number类型是所有基本类型包装类的父类),这两个方法其实都可以使用String类的静态方法valueOf或者各个基本类型包装类中的静态方法替代。
因此对于NumberFormat我们只学习下面两个方法中的format和parse:
getCurrencyInstance(Locale locale)方法:以参数Locale对象所指定的环境来获得处理货币的NumberFormat实例对象。
getPercentInstance(Locale locale)方法:以参数Locale对象所指定的环境类获得处理百分比数值的NumberFormat实例对象。
例2-1:
1 int price = 18;2 3 NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US);4 String priceformat = nf.format(price);5 System.out.println(priceformat);
以中国的货币格式显示,输出:¥18.00
例2-2:
1 int price = 18;2 3 NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);4 String priceformat = nf.format(price);5 System.out.println(priceformat);
以美国的货币格式显示,输出:$18.00
例2-3:
1 String priceformat = "¥18";2 3 NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);4 Number number = nf.parse(priceformat);5 double price = number.doubleValue();6 System.out.println(price);
将货币格式的字符串转换为基本类型数字,输出:18.0
例2-4:
1 double percent = 0.5;2 3 NumberFormat nf = NumberFormat.getPercentInstance();4 String percentFormat = nf.format(percent);5 System.out.println(percentFormat);
以百分比格式将基本类型数字转换为字符串,输出:50%