时间库 Joda Time使用介绍

张勇
Joda-Time的关键特性:
  • LocalDate:只包含日期
  • LocalTime:只包含时间
  • Instant:时间轴上的时间点
  • DateTime:时区中完整的日期和时间
  • DateTimeZone:更精确的时区
  • Duration和Period:持续时间
  • Interval:两个时间点之间的时间
  • 全面并且灵活的时间格式化与转换
举例

直接上代码,以下是结合API和网上一些常用例子整理,可以直接运用在你自己的代码中,做参考:

public class JodaTest {  
    public static void main(String[] args) {  
        //初始化时间  
        DateTime dateTime=new DateTime(2018, 12, 18, 18, 23,55);  

        // 年,月,日,时,分,秒,毫秒    
        DateTime dt3 = new DateTime(2018, 12, 18, 18, 23,55, 333);// 2018年12月18日18点23分55秒333毫秒  

        //下面就是按照一点的格式输出时间  
        String str2 = dateTime.toString("MM/dd/yyyy hh:mm:ss.SSSa");  
        String str3 = dateTime.toString("dd-MM-yyyy HH:mm:ss");  
        String str4 = dateTime.toString("EEEE dd MMMM, yyyy HH:mm:ssa");  
        String str5 = dateTime.toString("MM/dd/yyyy HH:mm ZZZZ");  
        String str6 = dateTime.toString("MM/dd/yyyy HH:mm Z");  

        DateTimeFormatter format = DateTimeFormat .forPattern("yyyy-MM-dd HH:mm:ss");  
        //时间解析    
        DateTime dateTime2 = DateTime.parse("2018-12-21 23:22:45", format);    

        //时间格式化,输出==> 2018/12/21 23:22:45 Fri    
        String string_u = dateTime2.toString("yyyy/MM/dd HH:mm:ss EE");    
        System.out.println(string_u);    

        //格式化带Locale,输出==> 2018年12月21日 23:22:45 星期五    
        String string_c = dateTime2.toString("yyyy年MM月dd日 HH:mm:ss EE",Locale.CHINESE);    
        System.out.println(string_c);  

        DateTime dt1 = new DateTime();// 取得当前时间  

        // 根据指定格式,将时间字符串转换成DateTime对象,这里的格式和上面的输出格式是一样的    
        DateTime dt2 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime("2018-12-26 03:27:39");  
        //计算两个日期间隔的年数,月数,天数,小时数,分钟数,秒数  
        Interval  interval = new Interval(dt1.getMillis(),dt2.getMillis());
        Period period = interval.toPeriod();
        System.out.printf("%d years, %d months, %d days, %d hours, %d minutes, %d seconds%n",
period.getYears(), period.getMonths(), period.getDays(),  
period.getHours(), period.getMinutes(), period.getSeconds());  
        //计算两个日期间隔的天数  
        LocalDate start=new LocalDate(2017, 12,14);    
        LocalDate end=new LocalDate(2018, 01, 15);    
        int days = Days.daysBetween(start, end).getDays();  

        //增加日期  
        DateTime dateTime1 = DateTime.parse("2012-12-03");  
        dateTime1 = dateTime1.plusDays(30);  
        dateTime1 = dateTime1.plusHours(3);  
        dateTime1 = dateTime1.plusMinutes(3);  
        dateTime1 = dateTime1.plusMonths(2);  
        dateTime1 = dateTime1.plusSeconds(4);  
        dateTime1 = dateTime1.plusWeeks(5);  
        dateTime1 = dateTime1.plusYears(3);  

        // Joda-time 各种操作.....    
        dateTime = dateTime.plusDays(1) // 增加天    
                            .plusYears(1)// 增加年    
                            .plusMonths(1)// 增加月    
                            .plusWeeks(1)// 增加星期    
                            .minusMillis(1)// 减分钟    
                            .minusHours(1)// 减小时    
                            .minusSeconds(1);// 减秒数  

        //判断是否闰月    
        DateTime dt4 = new DateTime();    
        org.joda.time.DateTime.Property month = dt4.monthOfYear();    
        System.out.println("是否闰月:" + month.isLeap());  

        //取得 3秒前的时间    
        DateTime dt5 = dateTime1.secondOfMinute().addToCopy(-3);    
        dateTime1.getSecondOfMinute();// 得到整分钟后,过的秒钟数    
        dateTime1.getSecondOfDay();// 得到整天后,过的秒钟数    
        dateTime1.secondOfMinute();// 得到分钟对象,例如做闰年判断等使用  

        // DateTime与java.util.Date对象,当前系统TimeMillis转换    
        DateTime dt6 = new DateTime(new Date());    
        Date date = dateTime1.toDate();    
        DateTime dt7 = new DateTime(System.currentTimeMillis());    
        dateTime1.getMillis();   

        Calendar calendar = Calendar.getInstance();    
        dateTime = new DateTime(calendar);  
    }  
}  
与JDK的Calendar比较
  • 获取18天之后的某天再下个月的当前周的第一天时间
//jdk  
Calendar current = Calendar.getInstance();  
current.add(Calendar.DAY_OF_MONTH, 18);  
current.add(Calendar.MONTH, 1);  
     ......  
DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
Date date = current.getTime();  
String dateStr = dateFormat.format(date);  
System.out.println(dateStr);  

//joda-time  
String dateStr = new DateTime().plusDays(18).plusMonths(1)  
    .dayOfWeek().withMinimumValue().toString("yyyy-MM-dd HH:mm:ss");  
System.out.println(dateStr);  
  • 计算两日期相差的天数
//jdk  
Calendar start = Calendar.getInstance();  
start.set(2017, Calendar.DECEMBER, 14);  
Calendar end = Calendar.getInstance();  
end.set(2018, Calendar.DECEMBER, 15);  
long startTim = start.getTimeInMillis();  
long endTim = end.getTimeInMillis();  
long diff = endTim-startTim;  
int days=(int) (diff/1000 / 3600 / 24);  

//joda-time  
LocalDate start=new LocalDate(2017, 12,14);  
LocalDate end=new LocalDate(2018, 12, 15);  
int days = Days.daysBetween(start, end).getDays();  
总结

其他就不多举例了,Joda-Time可以大大提高我们的代码效率,并且不容易出错,以上仅供参考。