joda-time的使用

Home:http://joda-time.sourceforge.net/

JavaDoc:http://joda-time.sourceforge.net/apidocs/index.html

package com.yan.joda;  

import java.util.Calendar;  
import java.util.Date;  
import java.util.Locale;  
import org.joda.time.DateTime;  
import org.joda.time.Days;  
import org.joda.time.LocalDate;  
import org.joda.time.format.DateTimeFormat;  
import org.joda.time.format.DateTimeFormatter;  

public class JodaTest {  

    public static void main(String[] args) {  
        //初始化時間  
                DateTime dateTime=new DateTime(2012, 12, 13, 18, 23,55);  

                // 年,月,日,時,分,秒,毫秒    
                DateTime dt3 = new DateTime(2011, 2, 13, 10, 30, 50, 333);// 2010年2月13日10點30分50秒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("2012-12-21 23:22:45", format);    

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

                //格式化帶Locale,輸出==> 2012年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("2012-12-26 03:27:39");  

                //計算兩個日期間隔的天數  
                LocalDate start=new LocalDate(2012, 12,14);    
                LocalDate end=new LocalDate(2013, 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的類去做,不用joda,然後再用joda去做,以做比較

用jdk做的例子,這裏算的從出生到現在的時間間隔是準確的,如果是輸入的某天來算的話就不是很準確,多一秒就算一天。可以看到用jdk去做的話,要寫的代碼還是挺繁瑣的。

import java.text.SimpleDateFormat;  
import java.util.Calendar;  
import java.util.Date;  
import java.util.Scanner;  

public class CalBaby {  
    private final static String birthday = "2012-3-10 08:20:55";  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        while(true){  
            String format1 = "yyyy-MM-dd";  
            String format2 = "yyyy-MM-dd HH:mm:ss";  
            Scanner s = new Scanner(System.in);  
            System.out.println("########################################");  
            cutTwoDateToDay(convertToDate1(birthday,format2),new Date(),false);  
            System.out.println("請選擇操作");  
            System.out.println("請輸入日期(格式例如:2012-11-08)");  
            System.out.println("########################################");  
            String endDateStr = s.nextLine();  
            Date endDate = convertToDate1(endDateStr,format1);  
            if(endDate == null){  
                System.out.println("輸入格式錯誤!請重新輸入.");  
                continue;  
            }  
            boolean inputFlag = true;  
            cutTwoDateToDay(convertToDate1(birthday,format2),endDate,inputFlag);  
        }  

    }  

    /**  
     * 計算兩個日期之間的差距天數  
     *   
     * @param a  
     * @param b  
     * @return  
     */    
    public static void cutTwoDateToDay(Date beginDate, Date endDate,boolean inputFlag) {    
        Calendar calendar = Calendar.getInstance();    
        long intervalDays = 0;    
        calendar.setTime(beginDate);    
        long begin = calendar.getTimeInMillis();    
        calendar.setTime(endDate);    
        long end = calendar.getTimeInMillis();  
        long totalM = end - begin;  
        System.out.println((end -begin));  
        System.out.println(24*60*60*1000);  
        intervalDays = totalM /(24*60*60*1000);  
        long intervalHours = (totalM - (intervalDays*24*60*60*1000))/(60*60*1000);  
       long intervalMin = (totalM - intervalDays * (24*60*60*1000) - intervalHours*60*60*1000)/(60*1000);  
       if(inputFlag){  
           if(totalM > 0L && totalM %(24*60*60*1000) > 0L){  
               intervalDays = intervalDays + 1;  
           }  
           System.out.println("寶寶從出生到"+formatDate(endDate,"yyyy-MM-dd")+"已經"+intervalDays+"天了");  
       }else{  
           System.out.println("寶寶來到這個世界已經"+intervalDays+"天"+intervalHours+"小時"+intervalMin+"分鐘了");  
       }  

    }   

    /**  
     * 將字符串日期轉換爲Date   yyyy-MM-dd HH:mm:ss  yyyy-MM-dd 
     *   
     * @param s  
     * @return  
     */    
    public static Date convertToDate1(String s,String format) {    

        if (s == null) {    
            return null;    
        }    
        try {    
            SimpleDateFormat df = new SimpleDateFormat(format);    
            return df.parse(s);    
        } catch (Exception e) {    
            return null;    
        }    
    }  

    public static String formatDate(Date date, String strType)  
    {  
        if (date == null)  
        {  
            return null;  
        }  

        SimpleDateFormat sdf = new SimpleDateFormat(strType);  
        try  
        {  
            return sdf.format(date);  
        }  
        catch (Exception e)  
        {  
            return null;  
        }  
    }  
}  

下面是用joda來做,用這個來做就簡單的多了,而且也很準確。

import java.util.Scanner;  
import org.joda.time.DateTime;  
import org.joda.time.Days;  
import org.joda.time.LocalDate;  
import org.joda.time.format.DateTimeFormat;  
import org.joda.time.format.DateTimeFormatter;  

public class CalBabyJoda {  

    private final static String birthday = "2012-3-10 08:20:55";  

    public static void main(String[] args) {  
        while(true){  
            Scanner s = new Scanner(System.in);  
            System.out.println("########################################");  
            DateTimeFormatter format1 = DateTimeFormat .forPattern("yyyy-MM-dd HH:mm:ss");  
            DateTimeFormatter format2 = DateTimeFormat .forPattern("yyyy-MM-dd");  
            DateTime startDateTime = DateTime.parse(birthday, format1);  
            System.out.println("寶寶來到這個世界已經");  
            calDateToDay(startDateTime,new DateTime());  
            System.out.println("如選擇其它日期請輸入(格式例如:2012-11-08 14:24:54或着2012-11-08)");  
            System.out.println("########################################");  
            String endDate = s.nextLine();  
            DateTime endDateTime = null;  
            try{  
                endDateTime = DateTime.parse(endDate,format1);  
            }catch(Exception e){  
                try{  
                    endDateTime = DateTime.parse(endDate,format2);  
                }catch(Exception e1){  
                    System.out.println("輸入格式錯誤!請重新輸入.");  
                    continue;  
                }  
            }  
            System.out.println("寶寶從出生到" + endDateTime.toString("yyyy-MM-dd HH:mm:ss") + "已經");  
            calDateToDay(startDateTime,endDateTime);  
        }  
    }  

    public static void calDateToDay(DateTime startDateTime,DateTime endDateTime){  

         LocalDate start=new LocalDate(startDateTime);    
        LocalDate end=new LocalDate(endDateTime);  
        Days days = Days.daysBetween(start, end);  
        int intervalDays = days.getDays();  
        int intervalHours = endDateTime.getHourOfDay() - startDateTime.getHourOfDay();  
        int intervalMinutes = endDateTime.getMinuteOfHour() - startDateTime.getMinuteOfHour();  
        int intervalSeconds = endDateTime.getSecondOfMinute() - startDateTime.getSecondOfMinute();  


        if(intervalSeconds < 0){  
            intervalMinutes = intervalMinutes -1;  
            intervalSeconds = 60 + intervalSeconds;  
        }  

        if(intervalMinutes < 0){  
            intervalHours = intervalHours -1;  
            intervalMinutes = 60 + intervalMinutes;  
        }  

        if(intervalHours < 0){  
            intervalDays = intervalDays -1;  
            intervalHours = 24 + intervalHours;  
        }  

        System.out.println(intervalDays + "天" + intervalHours +   
                "小時" + intervalMinutes + "分鐘" + intervalSeconds + "秒");  
        System.out.println("############################");  
    }  

}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章