首页 » 编写高质量代码:改善Java程序的151个建议 » 编写高质量代码:改善Java程序的151个建议全文在线阅读

《编写高质量代码:改善Java程序的151个建议》建议142:推荐使用Joda日期时间扩展包

关灯直达底部

开发一个项目必然要和日期时间打交道,特别是一些全球性的项目,必须要考虑语言和时区问题,但是在JDK中,日期时间的操作比较麻烦,例如1000小时后是星期几,伦敦时间是几点等,这里介绍一下通过Joda开源包来操作时间的方法,非常简单方便。

(1)本地格式的日期时间

依据操作系统或指定的区域输出日期或时间,例如:


//当前时间戳

DateTime dt=new DateTime();

//输出英文星期

dt.dayOfWeek().getAsText(Locale.ENGLISH);

//本地日期格式

dt.toLocalDate();

//日期格式化

dt.toString(DateTimeFormat.forPattern("yyyy年M月d日"));


(2)日期计算

这是Joda最方便的地方,也是JDK最麻烦的地方,比如我们要计算100天后是星期几,直接使用JDK提供的日期类会非常麻烦,使用Joda就简单很多,例如:


//当前时间戳

DateTime dt=new DateTime();

//加100小时是星期几

dt.plusHours(100).dayOfWeek();

//100天后的日期

dt.plusDays(100).toLocalDate();

//10年前的今天是星期几

dt.minusYears(10).dayOfWeek().getAsText();

//离地球毁灭还有多少小时

Hours.hoursBetween(dt, new DateTime("2012-12-21")).getHours();


这里需要注意的是,DateTime是一个不可变类型,与String非常类似,即使通过plusXXX、minusXX等方法进行操作,dt对象仍然不会变,只是新生成一个DateTime对象而已。但是,Joda也提供了一个可变类型的日期对象:MutableDateTime类,这样,日期的加减操作就更加方便了,比如列出10年内的黑色星期五,实现代码如下(此实现若用JDK的类来计算会异常复杂,读者可以尝试一下):


//当前可变时间

MutableDateTime mdt=new MutableDateTime();

//10年后的日期

DateTime destDateTime=dt.plusYears(10);

while(mdt.isBefore(destDateTime)){

//循环一次加1天

mdt.addDays(1);

//是13号,并且是星期五

if(mdt.getDayOfMonth()==13&&mdt.getDayOfWeek()==5){

//打印出10年内所有的黑色星期五

System.out.println("黑色星期五:"+mdt);

}

}


(3)时区时间

这个比较简单实用,给定一个时区或地区代码即可计算出该时区的时间,比如在一个全球系统中,数据库中全部是按照标准时间来记录的,但是在展示层要按照不同的用户、不同的时区展现,这就涉及时区计算了,代码如下:


//当前时间戳

DateTime dt=new DateTime();

//此时伦敦市的时间

dt.withZone(DateTimeZone.forID("Europe/London"));

//计算出标准时间

dt.withZone(DateTimeZone.UTC);


Joda还有一个优点,它可以与JDK的日期库方便地进行转换,可以从java.util.Date类型转为Joda的DateTime类型,也可以从Joda的DateTime转为java.util.Date,代码如下:


DateTime dt=new DateTime();

//Joda的DateTime转为JDK的Date

Date jdkDate=dt.toDate();

//JDK的Date转为Joda的DateTime

dt=new DateTime(jdkDate);


经过这样的转换,Joda可以很好地与现有的日期类保持兼容,在需要复杂的日期计算时使用Joda,在需要与其他系统通信或写到持久层中时则使用JDK的Date。Joda是一种令人惊奇的高效工具,无论是计算日期、打印日期,或是解析日期,Joda都是首选,当然日期工具类也可以选择date4j,它也是一个不错的开源工具,这里就不再赘述了。