转载请注明出处:http://blog.csdn.net/wl9739/article/details/51882913
在上篇文章Java中的时间和日期(上)里面,简单介绍了Java中的Date类,Calendar类以及用于格式化的SimpleDateFormater类。使用这些的时候我们会明显地感受到其中的不便之处,比如,Calendar类的月份是从0开始计数的;日期格式输出不够友好,很多情况下都需要使用SimpleDateFormater类来格式化;一些简单得日期计算也比较麻烦等等。所以就有了joda-time
这种第三方库来简化java对于时间和日期的操作。为了改变这种情况,java 8中对时间和日期对处理就吸收了joda-time
库的特性。那么新的时间日期处理会带来怎样的便捷呢?这便是本篇文章所要聊的内容。
月份和星期的枚举类
Month
在以前使用Java的时候,你一定痛恨了月份的表示和计算,最主要的原因就是因为一月份是从0开始计数的。而在Java 8中为了改变这一现状,增加了一个Month
枚举类来表示月份。使用这个枚举类甚至还可以直接进行月份的加减运算!
of(int month)
这是一个静态方法,用于创建一个Month
对象。传入的参数当然是从1开始计数啦,1表示一月,12表示十二月。当传入的参数小于1或者大于12时,就会抛出异常。getValue()
返回该Month
对象当前的值。一月份返回1,二月份返回2,依次类推。minus(long months)
这个是用来做月份的减法计算的。传入的参数表示你想在该Month
对象的基础上减去几个月。如果是1月份减去2个月,返回的当然是11月份。plus(long months)
用来计算月份的加法。传入的参数表示你想在该Month
对象的基础上增加几个月。比如12月加2个月就变成了二月份。maxLength(), minLength()和length(boolean leapYear)
用来获取Month
对象表示的该月的日期数。其中,length(boolean leapYear)
中的参数表示是否为闰年。其实这三个方法返回的结果在很多情况下都是一样的,返回的都是当月的日期数,30或者31。只有二月份除外,当Month
对象表示二月份时,maxLength()
和length(true)
返回29,minLength()
和length(false)
返回28。
下面用代码来说明上述方法的使用:
public static void main(String[] args) {
System.out.println(Month.DECEMBER); // DECEMBER
System.out.println(Month.of(2)); // FEBRUARY
Month month = Month.FEBRUARY;
System.out.println(month.getValue()); // 2
System.out.println(month.minus(3)); // NOVEMBER
System.out.println(month.plus(2)); // APRIL
System.out.println(month.length(false)); // 28
System.out.println(month.length(true)); // 29
}
有时候我们希望返回月份是中文,而不是英文。毕竟程序员大多都比较懒,能少转化一次自然是很好的。又或者你需要显示的是月份的英文缩写?Java 8都为你想到了。只要调用getDisplayName(TextStyle, Locale)
方法就行,该方法第一个参数是文本类型,也就是说你想显示完整的名称还是缩写;第二个参数表示地区,如果没有特殊要求,传入Locale.getDefault()
就行。就像下面的代码演示的那样:
public static void main(String[] args) {
Month month = Month.APRIL;
System.out.println(month.getDisplayName(TextStyle.FULL, Locale.getDefault())); // 四月
System.out.println(month.getDisplayName(TextStyle.SHORT, Locale.getDefault())); // 四月
System.out.println(month.getDisplayName(TextStyle.NARROW, Locale.getDefault())); // 4
System.out.println(month.getDisplayName(TextStyle.FULL, Locale.ENGLISH)); // April
System.out.println(month.getDisplayName(TextStyle.SHORT, Locale.ENGLISH)); // Apr
System.out.println(month.getDisplayName(TextStyle.NARROW, Locale.ENGLISH)); // A
}
DayOfWeek
DayOfWeek枚举类用来表示一个周的七天。常用的方法和Month
枚举类的几乎一致,包括of(int dayOfWeek)
静态方法用于创建DayOfWeek
对象;getValue()
方法用来获取该对象的值;plus(long days)
和minus(long days)
方法用来进行加减法计算。也可以使用getDisplayName(TextStyle style, Locale locale)
来格式化输出。代码演示如下:
public static void main(String[] args) {
System.out.println(DayOfWeek.FRIDAY); // FRIDAY
System.out.println(DayOfWeek.of(7)); // SUNDAY
DayOfWeek dayOfWeek = DayOfWeek.TUESDAY;
System.out.println(dayOfWeek.getValue()); // 2
System.out.println(dayOfWeek.plus(3)); // FRIDAY
System.out.println(dayOfWeek.minus(2)); // S