简要介绍下这个Java 8之前的日期API的使用。
SimpleDateFormat类
该类主要用于对util.Date类的格式化和解析。以下我们从实例化、格式化和解析三个方面来了解这个类的作用。
关于Date类的使用请看这里。
实例化
实例化主要用到的有两种构造器:
// 空参构造器,采用默认格式
SimpleDateFormat sdf = new SimpleDateFormat();
// 带参指定格式的构造器
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
参数中对应字符意义如下:
y:年
M:月
d:日
h:时
m:分
s:秒
格式化
格式化指的是将储存日期的类转化为字符串记录的日期的形式,这里主要指Date类转化为String类。
格式化主要靠调用format(Date date)方法,该方法按format指定的格式将Date对象转化为一个String对象,并返回这个String对象的引用。源码:
public final String format(Date date)
{
return format(date, new StringBuffer(),
DontCareFieldPosition.INSTANCE).toString();
}
方法的使用:
Date date = new Date(); // 新建一个util.Date对象
System.out.println(date); // Wed Jun 24 11:48:10 CST 2020
String format = sdf.format(date); // 格式化:按默认的格式
System.out.println(format); // 20-6-24 上午11:48
String format1 = sdf1.format(date); // 格式化,按给定的格式
System.out.println(format1); // 2020-06-24 12:09:58
值得一提的是,MMM将以中文形式输出月份:
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MMM-dd hh:mm:ss");// 3*M
String format1 = sdf2.format(date);
System.out.println(format1); // 2020-六月-24 12:16:05
解析
解析是格式化的逆过程,指的是将表示日期的字符串转化为记载日期的类,这里指的是util.Date类。
解析主要依靠parse(String source)方法,返回一个Date对象的引用,同时会抛ParseException异常。源码:
public Date parse(String source) throws ParseException
{
ParsePosition pos = new ParsePosition(0);
Date result = parse(source, pos);
if (pos.index == 0)
throw new ParseException("Unparseable date: \"" + source + "\"" ,
pos.errorIndex);
return result;
}
现实中人们记录一个日期时间的所采取的文字格式是多种多样的,有的人习惯以年月日的方式(2020-06-24)记录,有的人习惯反过来(24-06-2020),还有人喜欢用斜杠来分隔(2020/06/24)。
格式的多样给计算机记录人类所表示的日期带来了一定困难,因此在解析时,我们需要先指定一个标准格式。这个标准格式既是SimpleDateFormat对象新建时构造器所传入的格式,换言之,与SimpleDateFormat对象进行格式化采取的格式是一致的。
// 空参构造器默认的格式是:"20-6-24 上午11:48",我们则必须使用与其相同的格式的字符串来表示日期
String str = "2020-6-22 下午1:21"; // 采取其默认格式化时的格式
Date date1 = sdf.parse(str); // 解析,获取一个Date类对象的引用
System.out.println(date1); // Mon Jun 22 13:21:00 CST 2020
若传入字符串的格式不正确时,会抛ParseException。
String str = "2020/6/22 下午1:21"; // 修改'-'为'/'
Date date1 = sdf.parse(str); // 异常
以上是对构造时使用了默认空参构造器的SimpleDateFormat对象进行测试。同理,对于构造时传入了参数规定了格式的SimpleDateFormat对象,解析时也需要按规定的格式传入字符串。
Date date2 = sdf1.parse("2019-11-22 11:34:32");
System.out.println(date2);
SimpleDateFormat类的主要功能就是格式化和解析,下面通过两个简单的练习来加深对这个类的掌握。
两个简单的练习
1、将字符串"2077-01-01"转化为sql.Date存储。
@Test
public void exer1() throws ParseException {
String str = "2077-01-01";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date utilDate = sdf.parse(str);
// System.out.println(utilDate);
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
System.out.println(sqlDate);
}
2、计算2020-07-01至1990-09-23之间有多少天。
@Test
public void exer2() throws ParseException {
String start = "1990-09-23";
String end = "2020-07-01";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = simpleDateFormat.parse(start);
Date endDate = simpleDateFormat.parse(end);
int days = (int)((endDate.getTime()-startDate.getTime())/(1000*60*60*24)+1);
}