1 DateFormat是什么?有什么用?
java.text.DateFormat
是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
- 格式化:按照指定的格式,把Date对象转换为String对象。
- 解析:按照指定的格式,把String对象转换为Date对象。
2 构造方法
由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat
。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:
public SimpleDateFormat(String pattern)
:用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。参数pattern是一个字符串,代表日期时间的自定义格式。
3 格式规则
常用的格式规则为:
标识字母(区分大小写) | 含义 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
备注:更详细的格式规则,可以参考SimpleDateFormat类的API文档。
4 常用方法
DateFormat类的常用方法有:
public String format(Date date)
:可以把日期对象格式化成我们喜欢的时间形式,返回的是字符串!public String format(Object time)
:可以把时间毫秒值格式化成我们喜欢的时间形式,返回的是字符串!public Date parse(String date) throws ParseException
:把字符串的时间解析成日期对象
4.1 代码示例
public static void main(String[] args) throws ParseException {
//格式化:从 Date 到 String
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String s = sdf.format(d);
String ss = sdf.format(d.getTime());
System.out.println(s);
System.out.println(ss);
System.out.println("--------");
//从 String 到 Date
String sss = "2048-08-09 11:11:11";
//ParseException
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dd = sdf2.parse(sss);
System.out.println(dd);
}
输出:
2022年01月08日 16:00:36
2022年01月08日 16:00:36
--------
Sun Aug 09 11:11:11 GMT+08:00 2048
5 小结
简单日期格式化类java.text.SimpleDateFormat
不仅可以把日期对象和时间毫秒值格式化成我们喜欢的字符串时间形式,它还可以把字符串的时间解析成日期对象。
6 补充一道面试题
请问 “2019-11-04 09:30:30” 往后 1天15小时,30分29s后的时间是多少?
6.1 方法一(利用Date)
public static void main(String[] args) throws ParseException {
// a.定义一个字符串时间
String date = "2019-11-04 09:30:30";
// b.把字符串的时间解析成Date日期对象 。(重点)
// 1.创建一个简单日期格式化对象负责解析字符串的时间成为日期对象
// 注意:参数必须与被解析的时间的格式完全一致,否则执行报错!!
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 2.开始解析成日期对象
Date newDate = sdf.parse(date);
// c.得到日期对象的时间毫秒值 + 往后走 1天15小时,30分29s
long time = newDate.getTime() + (24L *60*60 + 15*60*60 + 30*60 + 29) * 1000;
// d.把时间毫秒值格式化成喜欢的字符串的时间形式!
System.out.println(sdf.format(time));
}
输出:
2019-11-06 01:00:59
值得注意的是,步骤c中的24L
利用java的自动类型转换将int
类型转换为long
类型,以防止越界!!!
6.2 方法二(利用Calendar)
public static void main(String[] args) throws ParseException {
// 1.创建一个代表2019-11-04 09:30:30的Calendar对象
// Calendar是一个抽象类,不能创建对象。
// 我们可以使用它的子类:java.util.GregorianCalendar类。
// 有两种方式可以获取GregorianCalendar对象:
// 1.直接创建GregorianCalendar对象;
// 2.通过Calendar的静态方法getInstance()方法获取GregorianCalendar对象
Calendar calendar = Calendar.getInstance();
// public void set(int field,int value) 设置某个字段的值
calendar.set(2019, Calendar.NOVEMBER, 4, 9, 30, 30);
// 2.得到往后走 1天15小时,30分29s的Calendar对象
// public void add(int field,int amount)为某个字段增加/减少指定的值
// 这里的 Calendar.*** 都是Calender中定义的常量
calendar.add(Calendar.DATE, 1);
calendar.add(Calendar.HOUR_OF_DAY, 15);
calendar.add(Calendar.MINUTE, 30);
calendar.add(Calendar.SECOND, 29);
// 3.创建一个简单日期格式化对象负责解析字符串的时间成为日期对象
// 注意:参数必须与被解析的时间的格式完全一致,否则执行报错!!
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 4.把calendar对象格式化成指定的字符串的时间形式
// Calendar中的getTime与Date中的getTime不同,前者返回的是Date对象。
// Calendar中getTimeInMillis才等同于Date中的getTime,返回毫秒值。
System.out.println(sdf.format(calendar.getTime()));
}
输出:
2019-11-06 01:00:59