在《Android Programming : The Big Nerd Ranch Guide (3rd Edition)》书中,作者提出用DateFormat方法来格式化时间。
在之前的代码中,通过Date()获取当前的时间,但是Date时间对象显示十分冗长,不方便用户查看。
那么接下来,我们使用DateFormat来格式化时间。在Crime类中,申明一个新的字符串变量,命名为mDateStr,并生成其getter方法。在构造函数中,添加DateFormat方法。
private String mDateStr;
Crime() {
mId = UUID.randomUUID();
mDate = new Date();
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.ENGLISH);
mDateStr = dateFormat.format(mDate);
}
public String getmDateStr() {
return mDateStr;
}
除了getDateInstance获取时间的实例对象外,DateFormat还可以获取getTimeInstance(获取时间)、getDateTimeInstance(获取日期和时间)这两个实例对象。其中的两个参数,前者表示日期/时间显示的格式,包括FULL、LONG、MEDIUM、SHORT,可以通过调试看下他们的区别;后者表示地区。
下图为MEDIUM的格式。
有些需求会要求日期显示两位数,比如“2019-03-04”,以上方法就不适用了,我们可以用SimpleDateFormat来客制化日期格式。
SimpleDateFormat是DateFormat的一个子类,在调整代码之前,需要了解SimpleDateFormat中一些模式字母(pattern letters)的含义。oracle相关文档中解释得很详细:
常用的一些表示,归纳如下:
y:年
M:月
d:日
h:时(12小时制,0-12)
H:时(24小时制,0-23)
m:分
s:秒
S:毫秒
E:星期几
a:上下午标识
了解这些后,就可以修改代码啦,将DateFormat相关代码注释掉,换成SimpleDateFormat。
Crime() {
mId = UUID.randomUUID();
mDate = new Date();
// DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.ENGLISH);
// mDateStr = dateFormat.format(mDate);
SimpleDateFormat dateFormat = new SimpleDateFormat("E,MM dd,yyyy", Locale.ENGLISH);
mDateStr = dateFormat.format(mDate);
}
运行代码,效果如下:
这时,“月/日”都是两位数了,但这看上去很突兀,如果能把月换成英文就好看了,查阅SimpleDateFormat相关文档,可以看到
如果字母数大于等于3个时,月份显示为文字,否则就显示为数字;当字母大于等于4个时显示全称,否则显示缩写。因此,可以做以下微调:
Crime() {
mId = UUID.randomUUID();
mDate = new Date();
// DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.ENGLISH);
// mDateStr = dateFormat.format(mDate);
SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE,MMMM dd,yyyy", Locale.ENGLISH);
mDateStr = dateFormat.format(mDate);
}
此时再运行代码,就可以得到我们想要的效果。