日期时间格式化
java.text.DateFormat类用于对日期时间进行格式化,它可以把Date对象格式化为字符串,或者是把字符串解析为Date对象:
a.String format(Date date):把Date对象格式化为字符串。
b.Date parse(String source) throws ParseException:把字符串解析为Date对象。
DateFormat类本身是一个抽象类,无法直接通过new运算创建实例,创建实例需要使用其实现类java.text.SimpleDateFormat。SimpleDateFormat类常用的构造方法有:
a.SimpleDateFormat(String pattern):传入模式字符串创建SimpleDateFormat对象。
b.SimpleDateFormat(String pattern, Locale locale):传入模式字符串以及Locale对象创建SimpleDateFormat对象。
其中,模式字符串是指使用日期时间格式化编码组成的字符串。常用的日期时间格式化编码有:
字母 | 含义 | 格式 |
G | 时代 | Text |
y | 年份 | Year |
M | 月份 | Month |
W | 对应一个月的周数 | Number |
w | 对应一年的周数 | Number |
D | 对应一年的天数 | Number |
d | 对应一个月的天数 | Number |
u | 对应一周的天数 | Number |
E | 星期 | Text |
a | 上下午 | Text |
H | 时,24小时制 | Number |
h | 时,12小时制 | Number |
m | 分 | Number |
s | 秒 | Number |
S | 毫秒 | Number |
z | 时区 | General time zone |
I. Text:如果字母数为4以上,则使用完整的形式;否则使用简短或缩写的形式。
II. Number:字母数为数字最小位数,对于较短位数的数字前面补0。
III.Year:如果字母数为2,则年份只输入后两位数字,年份区间为当前年份的80年前到20年后,即为(y-80, y+20]。例如:今年为2019年,则年份区间为(1939, 2039],此时39表示的是2039年,40表示的是1940年。如果字母数不为2则格式为Number。
IV.Month:如果字母数为3以上则格式为Text;小于3则格式为Number。
V. General time zone:如果时区有时区名,则格式为Text。对于使用GMT偏移值表示的时区,则语法为“GMT +|- 小时:00”。
1 @Test 2 void testDateFormat() { 3 Date date = new Date(); 4 System.out.println(date); 5 DateFormat df1 = new SimpleDateFormat("G y-M-d a h:m:s S E z", Locale.US); 6 System.out.println(df1.format(date)); 7 DateFormat df2 = new SimpleDateFormat("GGGG yyyy-MMMM-dd aaaa hh:mm:ss SSS EEEE zzzz", Locale.US); 8 System.out.println(df2.format(date)); 9 }
输出结果:
DateFormat类按日期时间字符串详细程度分为4种风格:FULL、LONG、MEDIUM、SHORT。
可以调用DateFormat类的静态方法创建其对象:
a.static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle):传入日期风格和时间风格创建DateFormat对象。
b.static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):传入日期风格、时间风格和Locale对象创建DateFormat对象。
1 @Test 2 void testDateFormat() { 3 Date date = new Date(); 4 System.out.println(date); 5 DateFormat df1 = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); 6 System.out.println(df1.format(date)); 7 DateFormat df2 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); 8 System.out.println(df2.format(date)); 9 DateFormat df3 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); 10 System.out.println(df3.format(date)); 11 DateFormat df4 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); 12 System.out.println(df4.format(date)); 13 }
输出结果:
数字格式化
java.text.NumberFormat类可以将数字对象格式化为指定格式的字符串,也可以将数字字符串解析(采用四舍五入法保留有效位数)为对应的数字对象:
a.String format(long number):将long型的对象格式化为数字字符串。
b.String format(double number):将double型的对象格式化为数字字符串。
c.parse(String source) throws ParseException:将数字字符串解析为Number对象。
NumberFormat本身是一个抽象类,无法直接通过new运算创建实例,创建实例需要使用其实现类java.text.DecimalFormat。DecimalFormat类常用的构造方法有:
a.DecimalFormat(String pattern):传入模式字符串创建DecimalFormat对象。
其中,模式字符串是指使用数字格式化编码组成的字符串。常用的数字格式化编码有:
符号 | 位置 | 含义 |
0 | 数字 | 数字,若没有该位则显示0 |
# | 数字 | 数字,若没有该位则不显示 |
. | 数字 | 小数点 |
- | 数字 | 负号 |
, | 数字 | 分组符 |
E | 数字 | 指数符 |
; | 子模式分隔 | 子模式分隔符 |
% | 前缀或后缀 | 百分符 |
‰ (u2030) |
前缀或后缀 | 千分符 |
' | 前缀或后缀 | 将特殊符号用单引号括起来表示将该符号作为文本 |
模式又分为两部分:正子模式和负子模式。正子模式是定义正数或零的模式,负子模式是定义负数的模式。模式必须包含正子模式,负子模式可有可无。如果需要显式地定义负子模式,则在正子模式后使用“;”进行区分。定义模式时需要注意以下几点:
a.若没有定义负子模式,则负子模式默认为正子模式前加上“-”。
b.负子模式和正子模式的前缀和后缀不能完全相同。若相同则表示为没有定义负子模式。
c.负子模式只用于定义前缀和后缀,也就是说,负子模式定义数字格式是没有任何意义的。
d.负子模式中使用“%”或“‰”仅作为前缀或后缀的作用,并不会对原数据造成改变。
e.正子模式中使用“%”或“‰”除了作为前缀或后缀的作用,还会对原数据造成改变。若定义了负子模式,定义在正子模式中的“%”或“‰”只对负子模式的数据造成改变,不会添加“%”或“‰”符号。
1 @Test 2 void testNumberFormat() { 3 System.out.println("--只定义了正子模式--"); 4 NumberFormat nf1 = new DecimalFormat("#.0"); 5 System.out.println(nf1.format(0)); 6 System.out.println(nf1.format(-1)); 7 8 System.out.println("--负子模式和正子模式的后缀完全相同--"); 9 NumberFormat nf2 = new DecimalFormat("#,###m;#m"); 10 System.out.println(nf2.format(123456789)); 11 System.out.println(nf2.format(-123456789)); 12 13 System.out.println("--负子模式中定义数字格式--"); 14 NumberFormat nf3 = new DecimalFormat("#;#.0m"); 15 System.out.println(nf3.format(0)); 16 System.out.println(nf3.format(-1)); 17 18 System.out.println("--负子模式使用%或‰--"); 19 NumberFormat nf4 = new DecimalFormat("#.0;#‰"); 20 System.out.println(nf4.format(0)); 21 System.out.println(nf4.format(-1)); 22 23 System.out.println("--正子模式使用%或‰--"); 24 NumberFormat nf5 = new DecimalFormat("#‰;#m"); 25 System.out.println(nf5.format(0)); 26 System.out.println(nf5.format(-1)); 27 }
输出结果:
NumberFormat分为4种类型:通用数字格式、整型数字格式、货币格式、百分比格式。
可以调用NumberFormat类的静态方法创建其对象:
a.static final NumberFormat getNumberInstance():创建通用数字格式的NumberFormat对象。
b.static final NumberFormat getIntegerInstance():创建整型数字格式的NumberFormat对象。
c.static final NumberFormat getCurrencyInstance():创建货币格式的NumberFormat对象。
d.static final NumberFormat getPercentInstance():创建百分比格式的NumberFormat对象。
1 @Test 2 void testNumberFormat() { 3 double number = 12345.67890; 4 NumberFormat nf1 = NumberFormat.getNumberInstance(); 5 System.out.println(nf1.format(number)); 6 NumberFormat nf2 = NumberFormat.getIntegerInstance(); 7 System.out.println(nf2.format(number)); 8 NumberFormat nf3 = NumberFormat.getCurrencyInstance(); 9 System.out.println(nf3.format(number)); 10 NumberFormat nf4 = NumberFormat.getPercentInstance(); 11 System.out.println(nf4.format(number)); 12 }
输出结果: