Java的格式化-DateFormat/NumberFormat

DateFormat 、NumberFormat 是 Format 的两个常用的子类,为我们进行格式化提供了很多便利:

DateFormat 

DateFormat类可以将一个日期/时间类(例如Date类)的对象格式化表示某地区或语言环境的日期/时间字符串,当然也能从字符串转换为日期/时间类。

DateFormat类具有一些表示日期/时间显示格式的整型常量:

SHORTMEDIUM(同时也是默认格式)LONGFULL这几种。分别表示了输出日期格式的详细程度。


DateFormat最终将一个日期/时间对象输出到字符串显示的格式会被三个因素影响,一是获取DateFormat实例对象的方法,二是该方法中指定的Locale对象,三是上面提到的4种日期长度格式常量。

我们看看DateFormat能获取实例对象的方法:

① getDateInstance方法,只获取日期的实例对象

② getTimeInstance方法,只获取时间的实例对象

③ getDateTimeInstance方法,获取日期和时间的实例对象

对上面的每个方法,有无参的(长度模式和Locale都采用默认值),有单独参数的(指定长度模式),有两个参数的(指定长度模式和Locale对象)共九种方法。

例1-1:

Date date = new Date();        
DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); //省略了Locale对象,默认中文环境
String dateStr = df.format(date);
System.out.println(dateStr);
只获取日期,长度模式为MEDIUM,输出:2016-8-1
例1-2:

Date date = new Date();        
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL);
String dateStr = df.format(date);
System.out.println(dateStr);
只获取日期,长度模式为FULL,输出:2016年8月1日 星期一

例1-3:

Date date = new Date();        
DateFormat df = DateFormat.getTimeInstance(DateFormat.FULL);
String dateStr = df.format(date);
System.out.println(dateStr);
只获取时间,长度模式为FULL,输出:下午04时33分17秒

当然是用DateFormat还能将一个字符串转换为日期/时间对象,但是用的时候一定要注意:字符串中日期的格式一定要满足DateFormat的四种长度模式常量指定的格式,并且在使用DateFormat方法时也要指定字符串中日期或时间使用的是哪种格式

例1-4:

String dateStr = "2016-8-1 16:39:27"      
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
Date date = df.parse(dateStr);
System.out.println(date);

 

获取日期和时间,长度模式为MEDIUM,输出:2016-8-1 16:39:27

将字符串转换为Date对象,getDateTimeInstance方法中必须要指明字符串中日期的采用的格式才能转换成功。当然如果我们只想获取该字符串中的日期或时间,只需要使用getDateInstance方法或getTimeInstance方法即可,但也必须要指明格式。

附:DateFormat非线程安全,因此每个线程都应该创建自己的DateFormat实例对象。

SimpleDateFormat 

上面我么可以用DateFormat输出2016-8-1,可是如果我们想把日月补成2位输出2016-08-01,这就不灵了,这时可以使用DateFormat的子类SimpleDateFormat来实现,SimpleDateFormat可以通过模式(pattern)实现定制格式化。

定制化方式:

String pattern= ...       
SimpleDateFormat df = new SimpleDateFormat(pattern); 

或者:

SimpleDateFormat df = new SimpleDateFormat(); 
df.applyPattern(pattern);

例2-1:

Date date = new Date();        
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
String dateStr = df.format(date);
System.out.println(dateStr);

输出:2016年08月01日 16:43

当然是用SimpleDateFormat也能将一个字符串转换为日期/时间对象,但是用的时候一定要注意:字符串中日期的格式一定要与pattern的定制格式相同

例2-2:

String dateStr = "2016年08月01日 16:43:44";      
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = df.parse(dateStr);

例2-3:

Date date = null;
String time = "2016-03-11 13:22:05";
SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = df1.parse(time);
SimpleDateFormat df2 = new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
String newTime = df2.format(date);
 
 
 
 

 

 
 
上面例子可以将 2016-03-11 13:22:05 格式化为 2016年03月11日 01:22 

时间日期标识符:

yyyy:年

MM:月

dd:日

hh:12小时制(1-12)

HH:24小时制(0-23)

mm:分

ss:秒

S:毫秒

E:星期几

D:一年中的第几天

F:一月中的第几个星期(会把这个月总共过的天除以7)

w:一年中的第几个星期

W:一月中的第几个星期(会根据实际情况来算)

a:上下午标识

k:和HH差不多,表示一天24小时制(1-24)

K:和hh差不多,表示一天12小时制(0-11)

z:表示时区

NumberFormat 

在NumberFormat类中为我们提供了格式化4种数字的方法:整数、小数、货币和百分比,通过工厂方法getIntegerInstance, getNumberIntance, getCurrencyInstance, getPercentInstance方法获得相应的实例对象就行。

对于NumberFormat类的getNumberInstance方法和getIntegerInstance方法也有format方法和parse方法,format方法将一个基本类型的数字转换为字符串,而parse方法将一个字符串转换为Number类型(Number类型是所有基本类型包装类的父类)。这两个方法其实都可以使用String.valueOf或者各个基本类型包装类中的静态方法(如Integer.parseInt)替代。

因此对于NumberFormat我们只学习下面两个方法中的format和parse:

getCurrencyInstance(Locale  locale)方法:以参数Locale对象所指定的环境来获得处理货币的NumberFormat实例对象。

getPercentInstance(Locale  locale)方法:以参数Locale对象所指定的环境类获得处理百分比数值的NumberFormat实例对象。

例3-1:

int price = 18;   
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);
String priceformat = nf.format(price);
System.out.println(priceformat);

 
以中国的货币格式显示,输出:¥18.00 

例3-2:

int price = 18;     
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US);
String priceformat = nf.format(price);
System.out.println(priceformat);
 
以美国的货币格式显示,输出:$18.00 

例3-3:

String priceformat = "¥18";     
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);
Number number = nf.parse(priceformat);
double price = number.doubleValue();
System.out.println(price);
 
 
将货币格式的字符串转换为基本类型数字,输出:18.0 

例3-4:

double percent = 0.5;  
NumberFormat nf = NumberFormat.getPercentInstance();
String percentFormat = nf.format(percent);
System.out.println(percentFormat);
 
 
以百分比格式将基本类型数字转换为字符串,输出:50% 


DecimalFormat 

DecimalFormat 是NumberFormat 类的子类,主要的作用是用来格式化数字使用,当然,在格式化数字的时候要比直接使用NumberFormat 更加方便,因为可以直接指定按用户自定义方式进行格式化操作,要使用DecimalFormat对象,必须提供给它提供一个格式化的模式(pattern):

String pattern = ..
DecimalFormat df = new DecimalFormat(pattern);

或者

DecimalFormat df = new DecimalFormat(pattern);
df.applyPattern(pattern);

例4-1:

DecimalFormat df = new DecimalFormat("#.##");
system.out.print("输出的数字:"+df.format(12.3456));

小数点后保留两位的例子,输出结果为

输出的数字:12.35

下面是pattern中某些字符的含义表:

0        一位数字,这一位缺失显示为0。用来补零

#        一位数字, 这一位缺失就不显示

.        小数点,不用多说了吧

,        千位分隔符

E       科学计数法

%      百分比



  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值