在之前的博客中我们使用到了操作日期的一些类,我们发现,如果我们想要获得指定格式的日期字符串可以做到但是很麻烦,下面为大家介绍几种日期的格式化方式。
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)。确切的结果取决于语言环境,但是通常:
如果愿意,还可以在格式上设置时区。如果想对格式化或解析施加更多的控制(或者给予用户更多的控制),可以尝试将从工厂方法所获取的 DateFormat 强制转换为 SimpleDateFormat。这适用于大多数国家/地区;只是要记住将其放入一个 try 代码块中,以防遇到特殊的格式。
方法名 | 说明 |
---|---|
protected DateFormat() | 创建一个新的 DateFormat |
返回值 | 方法名 | 说明 |
---|---|---|
Object | clone() | 重写 Cloneable |
boolean | equals(Object obj) | 重写 equals |
String | format(Date date) | 将一个 Date 格式化为日期/时间字符串 |
abstract StringBuffer | format(Date date, StringBuffer toAppendTo, FieldPosition | fieldPosition) |
StringBuffer | format(Object obj, StringBuffer toAppendTo, FieldPosition fieldPosition) | 重写 Format |
static Locale[] | getAvailableLocales() | 返回所有语言环境的数组,此类的 get*Instance 方法可以为其返回已本地化的实例 |
Calendar | getCalendar() | 获取与此日期/时间格式器关联的日历 |
static | DateFormat getDateInstance() | 获取日期格式器,该格式器具有默认语言环境的默认格式化风格 |
static DateFormat | getDateInstance(int style) | 获取日期格式器,该格式器具有默认语言环境的给定格式化风格 |
static DateFormat | getDateInstance(int style, Locale aLocale) | 获取日期格式器,该格式器具有给定语言环境的给定格式化风格 |
static DateFormat | getDateTimeInstance() | 获取日期/时间格式器,该格式器具有默认语言环境的默认格式化风格 |
static DateFormat | getDateTimeInstance(int dateStyle, int timeStyle) | 获取日期/时间格式器,该格式器具有默认语言环境的给定日期和时间格式化风格 |
static DateFormat | getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale) | 获取日期/时间格式器,该格式器具有给定语言环境的给定格式化风格 |
static DateFormat | getInstance() | 获取为日期和时间使用 SHORT 风格的默认日期/时间格式器 |
NumberFormat | getNumberFormat() | 获取此日期/时间格式器用于格式化和解析时间的数字格式器 |
static DateFormat | getTimeInstance() | 获取时间格式器,该格式器具有默认语言环境的默认格式化风格 |
static DateFormat | getTimeInstance(int style) | 获取时间格式器,该格式器具有默认语言环境的给定格式化风格 |
static DateFormat | getTimeInstance(int style, Locale aLocale) | 获取时间格式器,该格式器具有给定语言环境的给定格式化风格 |
TimeZone | getTimeZone() | 获取时区 |
int | hashCode() | 重写 hashCode |
boolean | isLenient() | 判断日期/时间解析是否为不严格的 |
Date | parse(String source) | 从给定字符串的开始解析文本,以生成一个日期 |
abstract Date | parse(String source, ParsePosition pos) | 根据给定的解析位置开始解析日期/时间字符串 |
Object | parseObject(String source, ParsePosition pos) | 解析字符串中的文本,以生成一个 Date |
void | setCalendar(Calendar newCalendar) | 设置此日期格式所使用的日历 |
void | setLenient(boolean lenient) | 指定日期/时间解析是否不严格 |
void | setNumberFormat(NumberFormat newNumberFormat) | 允许用户设置数字格式器 |
void | setTimeZone(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
上面介绍的DateFormat是日期格式化中最基本的方式,我们在实际应用开发中,使用最多的是SimpleDateFormat,而非DateFormat,SimpleDateFormat更加便捷。
SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
SimpleDateFormat使得可以选择任何用户定义的日期-时间格式的模式。可以根据需要使用 applyPattern 方法来修改格式模式。
日期和时间格式由日期和时间模式字符串指定。在日期和时间模式字符串中,未加引号的字母 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (‘)引起来,以免进行解释。”””表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。
定义了以下模式字母(所有其他字符 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’ 都被保留):
字母 | 日期或时间元素 | 表示 | 示例 |
---|---|---|---|
G | Era | 标志符 | Text |
y | 年 | Year | 1996; |
M | 年中的月份 | Month | July; Jul; 07 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday; Tue |
a | Am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数(1-12) | Number | 12 |
m | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |
方法名 | 说明 |
---|---|
SimpleDateFormat() | 用默认的模式和默认语言环境的日期格式符号构造 SimpleDateFormat |
SimpleDateFormat(String pattern) | 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat |
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols) | 用给定的模式和日期符号构造 SimpleDateFormat |
SimpleDateFormat(String pattern, Locale locale) | 用给定的模式和给定语言环境的默认日期格式符号构造 SimpleDateFormat |
返回值 | 方法名 | 说明 |
---|---|---|
void | applyLocalizedPattern(String pattern) | 将给定的本地化模式字符串应用于此日期格式 |
void | applyPattern(String pattern) | 将给定模式字符串应用于此日期格式 |
Object | clone() | 创建此 SimpleDateFormat 的一个副本 |
boolean | equals(Object obj) | 比较给定对象与此 SimpleDateFormat 的相等性 |
StringBuffer | format(Date date, StringBuffer toAppendTo, FieldPosition pos) | 将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer |
AttributedCharacterIterator | formatToCharacterIterator(Object obj) | 格式化生成 AttributedCharacterIterator 的对象 |
Date | get2DigitYearStart() | 返回在 100 年周期内被解释的两位数字年份的开始日期 |
DateFormatSymbols | getDateFormatSymbols() | 获取此日期格式的日期和时间格式符号的一个副本 |
int | hashCode() | 返回此 SimpleDateFormat 对象的哈希码值 |
Date | parse(String text, ParsePosition pos) | 解析字符串的文本,生成 Date |
void | set2DigitYearStart(Date startDate) | 设置 100 年周期的两位数年份,该年份将被解释为从用户指定的日期开始 |
void | setDateFormatSymbols(DateFormatSymbols newFormatSymbols) | 设置此日期格式的日期和时间格式符号 |
String | toLocalizedPattern() | 返回描述此日期格式的本地化模式字符串 |
String | toPattern() | 返回描述此日期格式的模式字符串 |
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
NumberFormat是所有数值格式的抽象基类。此类提供格式化和解析数值的接口。NumberFormat还提供了一些方法来确定哪些语言环境具有数值格式,以及它们的名称是什么。
NumberFormat可用于格式化和解析任何语言环境的数值。使代码能够完全独立于小数点、千位分隔符甚至所用特定小数位数的语言环境约定,并与数值格式是否为偶小数无关。
方法名 | 说明 |
---|---|
protected NumberFormat() | 唯一的构造方法 |
返回值 | 方法名 | 说明 |
---|---|---|
Object | clone() | 重写 Cloneable |
boolean | equals(Object obj) | 重写 equals |
String | format(double number) | 格式规范 |
abstract StringBuffer | format(double number, StringBuffer toAppendTo, FieldPosition pos) | 格式规范 |
String | format(long number) | 格式规范 |
abstract StringBuffer | format(long number, StringBuffer toAppendTo, FieldPosition pos) | 格式规范 |
StringBuffer | format(Object number, StringBuffer toAppendTo, FieldPosition pos) | 格式化一个数并将所得文本添加到给定字符串缓冲区 |
static Locale[] | getAvailableLocales() | 返回一个数组,它包含所有此类的 get*Instance 方法可以为其返回本地化实例的语言环境 |
Currency | getCurrency() | 获取格式化货币值时此数值格式使用的货币 |
static NumberFormat | getCurrencyInstance() | 返回当前默认语言环境的货币格式 |
static NumberFormat | getCurrencyInstance(Locale inLocale) | 返回指定语言环境的货币格式 |
static NumberFormat | getInstance() | 返回当前默认语言环境的通用数值格式 |
static NumberFormat | getInstance(Locale inLocale) | 返回指定语言环境的通用数值格式 |
static NumberFormat | getIntegerInstance() | 返回当前默认语言环境的整数格式 |
static NumberFormat | getIntegerInstance(Locale inLocale) | 返回指定语言环境的整数格式 |
int | getMaximumFractionDigits() | 返回数的小数部分所允许的最大位数 |
int | getMaximumIntegerDigits() | 返回数的整数部分所允许的最大位数 |
int | getMinimumFractionDigits() | 返回数的小数部分所允许的最小位数 |
int | getMinimumIntegerDigits() | 返回数的整数部分所允许的最小位数 |
static NumberFormat | getNumberInstance() | 返回当前默认语言环境的通用数值格式 |
static NumberFormat | getNumberInstance(Locale inLocale) | 返回指定语言环境的通用数值格式 |
static NumberFormat | getPercentInstance() | 返回当前默认语言环境的百分比格式 |
static NumberFormat | getPercentInstance(Locale inLocale) | 返回指定语言环境的百分比格式 |
RoundingMode | getRoundingMode() | 获取在此 NumberFormat 中使用的 RoundingMode |
int | hashCode() | 重写 hashCode |
boolean | isGroupingUsed() | 如果此格式中使用了分组,则返回 true |
boolean | isParseIntegerOnly() | 如果此格式只将数作为整数解析,则返回 true |
Number | parse(String source) | 解析给定字符串开头的文本,生成一个数值 |
abstract Number | parse(String source, ParsePosition parsePosition) | 如果可能则返回 Long (例如,在 [Long.MIN_VALUE, Long.MAX_VALUE] 范围内且没有小数),否则返回 Double |
Object | parseObject(String source, ParsePosition pos) | 解析字符串中的文本,以生成一个 Number |
void | setCurrency(Currency currency) | 设置格式化货币值时此数值格式使用的货币 |
void | setGroupingUsed(boolean newValue) | 设置此格式中是否使用分组 |
void | setMaximumFractionDigits(int newValue) | 设置数的小数部分所允许的最大位数 |
void | setMaximumIntegerDigits(int newValue) | 设置数的整数部分所允许的最大位数 |
void | setMinimumFractionDigits(int newValue) | 设置数的小数部分所允许的最小位数 |
void | setMinimumIntegerDigits(int newValue) | 设置数的整数部分所允许的最小位数 |
void | setParseIntegerOnly(boolean value) | 设置数是否应该仅作为整数进行解析 |
void | setRoundingMode(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
1
0.512
51%
DecimalFormat与NumberFormat的关系就好像SimpleDateFormat与DateFormat之间的关系。
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。
符号 | 位置 | 本地化? | 含义 |
---|---|---|---|
0 | 数字 | 是 | 阿拉伯数字 |
# | 数字 | 是 | 阿拉伯数字,如果不存在则显示为 0 |
. | 数字 | 是 | 小数分隔符或货币小数分隔符 |
- | 数字 | 是 | 减号 |
, | 数字 | 是 | 分组分隔符 |
E | 数字 | 是 | 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号 |
; | 子模式边界 | 是 | 分隔正数和负数子模式 |
% | 前缀或后缀 | 是 | 乘以 100 并显示为百分数 |
\u2030 | 前缀或后缀 | 是 | 乘以 1000 并显示为千分数 |
¤ (\u00A4) | 前缀或后缀 | 否 | 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符 |
‘ | 前缀或后缀 | 否 | 用于在前缀或或后缀中为特殊字符加引号,例如 “’#’#” 将 123 格式化为 “#123”。要创建单引号本身,请连续使用两个单引号:”# o”clock” |
方法名 | 说明 |
---|---|
DecimalFormat() | 使用默认模式和默认语言环境的符号创建一个 DecimalFormat |
DecimalFormat(String pattern) | 使用给定的模式和默认语言环境的符号创建一个 DecimalFormat |
DecimalFormat(String pattern, DecimalFormatSymbols symbols) | 使用给定的模式和符号创建一个 DecimalFormat。 |
返回值 | 方法名 | 说明 |
---|---|---|
void | applyLocalizedPattern(String pattern) | 将给定的模式应用于此 Format 对象 |
void | applyPattern(String pattern) | 将给定的模式应用于此 Format 对象 |
Object | clone() | 标准重写;没有语义上的变化 |
boolean | equals(Object obj) | 重写 equals |
StringBuffer | format(double number, StringBuffer result, FieldPosition fieldPosition) | 格式化一个 double 值,以生成一个字符串 |
StringBuffer | format(long number, StringBuffer result, FieldPosition fieldPosition) | 格式化一个 long 值,以生成一个字符串 |
StringBuffer | format(Object number, StringBuffer toAppendTo, FieldPosition pos) | 格式化一个数,并将所得文本追加到给定的字符串缓冲区 |
AttributedCharacterIterator | formatToCharacterIterator(Object obj) | 格式化一个 Object,以生成一个 AttributedCharacterIterator |
Currency | getCurrency() | 获取格式化货币值时,此十进制格式使用的货币 |
DecimalFormatSymbols | getDecimalFormatSymbols() | 返回小数格式符号的一个副本,通常程序员或用户不改变此副本 |
int | getGroupingSize() | 返回分组大小 |
int | getMaximumFractionDigits() | 获取某个数的小数部分中所允许的最大数字位数 |
int | getMaximumIntegerDigits() | 获取某个数的整数部分中所允许的最大数字位数 |
int | getMinimumFractionDigits() | 获取某个数的小数部分中所允许的最小数字位数 |
int | getMinimumIntegerDigits() | 获取某个数的整数部分中所允许的最小数字位数 |
int | getMultiplier() | 获取百分数、千分数和类似格式中使用的乘数 |
String | getNegativePrefix() | 获取负数前缀 |
String | getNegativeSuffix() | 获取负数后缀 |
String | getPositivePrefix() | 获取正数前缀 |
String | getPositiveSuffix() | 获取正数后缀 |
RoundingMode | getRoundingMode() | 获取在此 DecimalFormat 中使用的 RoundingMode |
int | hashCode() | 重写 hashCode |
boolean | isDecimalSeparatorAlwaysShown() | 允许获取整数中小数分隔符的行为 |
boolean | isParseBigDecimal() | 返回 parse(java.lang.String, java.text.ParsePosition) 方法是否返回 BigDecimal |
Number | parse(String text, ParsePosition pos) | 解析字符串中的文本,以生成一个 Number |
void | setCurrency(Currency currency) | 设置格式化货币值时,此数字格式使用的货币 |
void | setDecimalFormatSymbols(DecimalFormatSymbols newSymbols) | 设置小数格式符号,通常程序员或用户不改变此符号 |
void | setDecimalSeparatorAlwaysShown(boolean newValue) | 允许设置整数中小数分隔符的行为 |
void | setGroupingSize(int newValue) | 设置分组大小 |
void | setMaximumFractionDigits(int newValue) | 设置某个数的小数部分中所允许的最大数字位数 |
void | setMaximumIntegerDigits(int newValue) | 设置某个数字的整数部分中所允许的最大数字位数 |
void | setMinimumFractionDigits(int newValue) | 设置某个数的小数部分中所允许的最小数字位数 |
void | setMinimumIntegerDigits(int newValue) | 设置某个数字的整数部分中所允许的最小数字位数 |
void | setMultiplier(int newValue) | 设置百分数、千分数和类似格式中使用的乘数 |
void | setNegativePrefix(String newValue) | 设置负数前缀 |
void | setNegativeSuffix(String newValue) | 设置负数后缀 |
void | setParseBigDecimal(boolean newValue) | 设置 parse(java.lang.String, java.text.ParsePosition) 方法是否返回 BigDecimal |
void | setPositivePrefix(String newValue) | 设置正数前缀 |
void | setPositiveSuffix(String newValue) | 设置正数后缀 |
void | setRoundingMode(RoundingMode roundingMode) | 设置在此 DecimalFormat 中使用的 RoundingMode |
String | toLocalizedPattern() | 合成一个表示此 Format 对象当前状态的、已本地化的模式字符串 |
String | toPattern() | 合成一个表示此 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