一、DateFormat子类:
DateFormat是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化和分析日期或时间。DateFormat类中最重要的两个方法是format和parse,简单来说format(是将日期Date类的对象转化为用户所能看懂的字符串形式如2019年1月28日 )parse(是将用户所能看懂的字符串形式的日期转化为日期Date类)
format(Object obj, StringBuffer toAppendTo, FieldPosition pos)格式化对象并将结果文本附加到给定的字符串缓冲区。
format(Date date, StringBuffer toAppendTo, FieldPosition pos)格式化对象并将结果文本附加到给定的字符串缓冲区。
format(Date date)
//obj - 必须是数字或日期。
//toAppendTo - 返回时间字符串的字符串缓冲区。
//pos - 跟踪返回字符串中字段的位置。
//输入时:如果需要,可以使用对齐字段。输出时:对齐字段的偏移量。例如,给定时间文本“1996.07.10 AD at 15:08:56 PDT”,
//如果给定的fieldPosition是DateFormat.YEAR_FIELD,则fieldPosition的开始索引和结束索引将分别设置为0和4。
//请注意,如果同一时间字段在模式中出现多次,则将为该时间字段的第一次出现设置fieldPosition。例如,使用模式“haz(zzzz)”
//和对齐字段DateFormat.TIMEZONE_FIELD将日期格式化为时间字符串“1 PM PDT(Pacific Daylight Time)”,fieldPosition的开始索引和结束索引将设置为5和8,
//返回传递给toAppendTo的字符串缓冲区,附加了格式化文本。
parseObject(String source, ParsePosition pos)解析字符串中的文本以生成对象
parse(String source)解析字符串中的文本以生成对象
parse(String source, ParsePosition pos)解析字符串中的文本以生成对象
//source - 要解析的日期/时间字符串,其中一部分应该被解析。
//pos - ParsePosition具有索引和错误索引信息的对象.输入时,开始解析的位置; on output,解析终止的位置,或解析失败时的起始位置。
//返回Date,如果无法解析输入,则返回null,若为null则抛出NullPointerException
常用静态工厂方法:
(1)getInstance()
方法,使用SHORT样式的日期和时间获取格式化的日期和时间程序,输出样式:2019/1/28 下午5:23
(2)getDateInstance()
方法,获取具有默认语言环境的默认格式样式的日期格式化程序,输出样式:2019/1/28
getDateInstance(int style)
方法 //style为下面的日期长度参数,如SHORT
getDateInstance(int style,Locale alocale)
方法 //alocale为语言环境,如CHINA
(3)getDateTimeInstance()
方法,获取具有默认语言环境的默认格式样式的日期和时间格式化程序,输出样式:2019/1/28 下午5:23:12
getDateTimeInstance(int datastyle,int timestyle)
方法 //datastyle为下面的日期长度参数,timestyle为时间长度参数
getDateTimeInstance(int datastyle,int timestyle,Locale alocale)
方法
(4)getTimeInstance()
方法,获取具有默认语言环境的默认格式样式的时间格式化程序,输出样式:下午5:23:12
getTimeInstance(int style)
方法 //style为下面的时间长度参数
getTimeInstance(int style,Locale alocale)
方法 //alocale为语言环境,如CHINA
(5)getCalendar()方法,
获取与此日期/时间格式化程序关联的日历。
(6)getNumberFormat()方法,
获取此日期/时间格式化程序用于格式化和解析时间的数字格式化程序。
更多详细方法可以参照https://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html
可以将不同的选项传递给这些工厂方法来控制结果的长度; 从SHORT到MEDIUM到LONG到FULL到DEFAULT。确切的结果取决于区域设置,但通常:
SHORT: 2019/1/28 下午5:23
MEDIUM: 2019年1月28日 下午5:23:12
LONG: 2019年1月28日 CST 下午5:23:12
FULL: 2019年1月28日星期一 中国标准时间 下午5:23:12
DEFAULT: 2019年1月28日 下午5:23:12
实例:(一般通过get...创建对象)
package codeFormat;
import java.text.*;
import java.util.*;
public class ceshi {
public static void main(String[] args) throws Exception {
Date date = new Date();
DateFormat dateFormat1 = DateFormat.getDateInstance();//DateFormat为抽象类所以创建实例的时候不能加new
DateFormat dateFormat2 = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.CHINA);
DateFormat dateFormat3 = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.DEFAULT, Locale.CHINA);
System.out.println(dateFormat1.format(date));
System.out.println(dateFormat2.format(date));
System.out.println(dateFormat3.format(date));
DateFormat dateFormat4 = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);
DateFormat dateFormat5 = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.CHINA);
DateFormat dateFormat6 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.CHINA);
DateFormat dateFormat7 = DateFormat.getInstance();
System.out.println(dateFormat4.format(date));
System.out.println(dateFormat5.format(date));
System.out.println(dateFormat6.format(date));
System.out.println(dateFormat7.format(date));
try {
DateFormat dateFormat8 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM, Locale.CHINA);
System.out.println(dateFormat8.parse("2019年1月29日 下午2:23:45"));
}
catch (ParseException e) {
System.out.println(e.getMessage());
}
}
}
运行结果:
2019年1月28日
下午6:02
2019年1月28日星期一 下午6:02:49
2019年1月28日
下午6:02:49
2019年1月28日 CST 下午6:02:49
2019/1/28 下午6:02
Tue Jan 29 14:23:45 CST 2019
另外介绍一下DateFormat的子类SimpleDateFormat类
SimpleDateFormat类:
SimpleDateFormat
是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。它允许格式化(日期 - >文本),解析(文本 - >日期)和规范化。
日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串,从带引号的字母 'A'
来'Z'
和'a'
到 'z'
被解释为代表的日期或时间字符串的组件模式字母。可以使用单引号('
)引用文本以避免解释。 "''"
代表单引号。不解释所有其他字符; 它们只是在格式化过程中被复制到输出字符串中,或者在解析过程中与输入字符串匹配。
以下模式字母(从所有其他字符限定 'A'
到'Z'
和从'a'
到 'z'
保留):
字母 | 日期或时间组件 | 举例 |
G | 时代指示符 | AD |
y | 年 | 1996; 96 |
M | 一年中的月份 | July; Jul;07 |
w | 一年中的周数 | 27 |
W | 一月中的周数 | 2 |
D | 一年中的天数 | 189 |
d | 一个月的天数 | 10 |
F | 一个月中的周数 | 2 |
E | 一周中的天数 | Tuesday; Tue |
a | 上午/下午标记 | AM;PM |
H | 一天中的小时数(0-23) | 0 |
k | 一天中的小时数(1-24) | 24 |
K | 上午/下午中的小时数(0-11) | 0 |
h | 上午/下午中的小时数(1-12) | 12 |
m | 一小时中的分钟数 | 30 |
s | 一分钟中的秒钟数 | 55 |
S | 毫秒数 | 978 |
z | 时区 | Pacific Standard Time; PST;GMT-08:00;CST |
Z | 时区 | -0800 |
SimpleDateFormat类通过自身的构造方法来创建实例化对象:
SimpleDateFormat();使用默认语言环境的默认模式和日期格式符号构造对象
SimpleDateFormat(String pattern) ;使用给定模式和默认语言环境的默认日期格式符号构造对象
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols) ;使用给定的模式和日期格式符号构造对象
SimpleDateFormat(String pattern, Locale locale);使用给定模式和给定语言环境的默认日期格式符号构造对象
//pattern-用户自定义的日期时间模式
//formatSymbols-用户自定义的日期时间格式符号,如:y、M、d
//locale-用户自定义的语言环境
这里format()和parse()的调用和DateFormat类的调用方法相同
其中比较常用的成员方法:
(1)applyPattern(String pattern)可使用新的日期时间模式创建对象,或是用新的模式替换旧的模式
(2)toPattern()返回描述此日期格式的模式字符串。
更多详细方法可以参照https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
实例:
package codeFormat;
import java.text.*;
import java.util.*;
public class ceshi {
public static void main(String[] args) throws Exception{
Date date=new Date();
SimpleDateFormat myfmt=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
SimpleDateFormat myfmt1=new SimpleDateFormat("yy/MM/dd HH:mm");
SimpleDateFormat myfmt2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat myfmt3=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E");
SimpleDateFormat myfmt4=new SimpleDateFormat("一年中的第D天 一年中的第w个星期 一月中的第W个星期 在一天中的k时z时区");
System.out.println(myfmt4.format(date));
myfmt4.applyPattern("yy-MM-dd HH:mm");//替换
System.out.println(myfmt4.format(date));
System.out.println(date.toString());
System.out.println(myfmt.format(date));
System.out.println(myfmt1.format(date));
System.out.println(myfmt2.format(date));
System.out.println(myfmt3.format(date));
String s="2019年01月29日 05时39分52秒";
System.out.println(myfmt.parse(s));
System.out.println(myfmt.toPattern());
}
}
运行结果为:
一年中的第29天 一年中的第5个星期 一月中的第5个星期 在一天中的16时CST时区
19-01-29 16:16
Tue Jan 29 16:16:09 CST 2019
2019年01月29日 16时16分09秒
19/01/29 16:16
2019-01-29 16:16:09
2019年01月29日 16时16分09秒 周二
Tue Jan 29 05:39:52 CST 2019
yyyy年MM月dd日 HH时mm分ss秒