DateTime類的使用


首先我們在開發過程中經常會遇到對日期的一些處理,比如獲取當前系統時間,時間的格式化,獲取年月日時分秒毫秒、周幾、取特殊的日期,以及日期的比較,日期的后推,設置時區,計算區間的秒、毫秒、天等的數量;有時候jdk提供的 Date和 Calendar 不一定能夠滿足我們的需求,或則實現起來比較麻煩,這時我們可以試着使用一下DateTime。

一、下面介紹一下DateTime常用的API:

1、首先我們要使用DateTime ,必須要知道它的依賴:如果你不知道,可以進入maven倉庫找到依賴或自己下完jar包,添加自己的項目中,下面提供一下pom文件的依賴,進入maven的倉庫主頁 https://mvnrepository.com/ 搜索 Joda Time ,然后找到pom依賴:

<!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.10.5</version>
</dependency>

 

2、DateTime常用的API:

 /*
         * 1.初始化
         */
        //方法一:取系統點間
        DateTime dt = new DateTime();

        //方法二:通過java.util.Date對象生成
        dt = new DateTime(new Date());

        //方法三:指定年月日點分秒生成(參數依次是:年,月,日,時,分,秒,毫秒)
        dt = new DateTime(2012, 5, 20, 13, 14, 0, 0);

        //方法四:ISO8601形式生成
        dt = new DateTime("2012-05-20");
        dt = new DateTime("2012-05-20T13:14:00");

        //只需要年月日的時候
        LocalDate localDate = new LocalDate(2009, 9, 6);// September 6, 2009

        //只需要時分秒毫秒的時候
        LocalTime localTime = new LocalTime(13, 30, 26, 0);// 1:30:26PM

        /*
         * 2.獲取年月日點分秒
         */
        //
        int year = dt.getYear();
        //
        int month = dt.getMonthOfYear();
        //
        int day = dt.getDayOfMonth();
        //星期
        int week = dt.getDayOfWeek();
        //
        int hour = dt.getHourOfDay();
        //
        int min = dt.getMinuteOfHour();
        //
        int sec = dt.getSecondOfMinute();
        //毫秒
        int msec = dt.getMillisOfSecond();


        // 判斷當前是星期幾
        switch(dt.getDayOfWeek()) {
            case DateTimeConstants.SUNDAY:
                System.out.println("星期日");
                break;
            case DateTimeConstants.MONDAY:
                System.out.println("星期一");
                break;
            case DateTimeConstants.TUESDAY:
                System.out.println("星期二");
                break;
            case DateTimeConstants.WEDNESDAY:
                System.out.println("星期三");
                break;
            case DateTimeConstants.THURSDAY:
                System.out.println("星期四");
                break;
            case DateTimeConstants.FRIDAY:
                System.out.println("星期五");
                break;
            case DateTimeConstants.SATURDAY:
                System.out.println("星期六");
                break;
        }

        /*
         * 3.與JDK日期對象的轉換
         */
        //轉換成java.util.Date對象
        Date d1 = new Date(dt.getMillis());
        Date d2 = dt.toDate();

        //轉換成java.util.Calendar對象
        Calendar c1 = Calendar.getInstance();
        c1.setTimeInMillis(dt.getMillis());
        Calendar c2 = dt.toCalendar(Locale.getDefault());


        /*
         * 4.日期前后推算 (這個方法比較實用)
         */
        //
        DateTime yesterday = dt.minusDays(1);
        DateTime tomorrow = dt.plusDays(1);

        //
        DateTime lastMonth = dt.minusMonths(1);
        DateTime nextMonth = dt.plusMonths(1);

        //
        DateTime lastWeek = dt.minusWeeks(-1);
        DateTime nexWeek = dt.plusWeeks(1);

        //
        DateTime lastYear = dt.minusYears(1);
        DateTime nextYear = dt.plusYears(1);


        /*
         * 5.取特殊日期
         */
        //月末日期
        DateTime lastday = dt.dayOfMonth().withMaximumValue();

        //90天后那周的周一
        DateTime firstday = dt.plusDays(90).dayOfWeek().withMinimumValue();


        /*
         * 6.設置時區
         */
        //日本時間
        DateTimeZone.setDefault(DateTimeZone.forID("Asia/Tokyo"));
        dt = new DateTime();

        //倫敦時間
        dt = new DateTime(DateTimeZone.forID("Europe/London"));

        //東八區時間
        DateTimeZone.setDefault(DateTimeZone.forID("Asia/Shanghai"));


        /*
         * 7.計算區間
         */
        DateTime begin = new DateTime("2012-02-01");
        DateTime end = new DateTime("2012-05-01");

        //計算區間毫秒數
        Duration d = new Duration(begin, end);
        long time = d.getMillis();

        //計算區間天數
        Period p = new Period(begin, end, PeriodType.days());
        int days = p.getDays();

        //計算特定日期是否在該區間內
        Interval i = new Interval(begin, end);
        boolean contained = i.contains(new DateTime("2012-03-01"));


        /*
         * 8.日期比較
         */
        DateTime dt1 = new DateTime("2012-02-01");
        DateTime dt2 = new DateTime("2012-05-01");

        //和系統時間比
        boolean b1 = dt1.isAfterNow();
        boolean b2 = dt1.isBeforeNow();
        boolean b3 = dt1.isEqualNow();

        //和其他日期比
        boolean f1 = dt1.isAfter(dt2);
        boolean f2 = dt1.isBefore(dt2);
        boolean f3 = dt1.isEqual(dt2);

        /*
         * 9.格式化輸出
         */
        DateTime dateTime = new DateTime();

        String s1 = dateTime.toString("yyyy/MM/dd hh:mm:ss.SSSa");
        String s2 = dateTime.toString("yyyy-MM-dd HH:mm:ss");
        String s3 = dateTime.toString("EEEE dd MMMM, yyyy HH:mm:ssa");
        String s4 = dateTime.toString("yyyy/MM/dd HH:mm ZZZZ");  //ZZZZ 表示 時區
        String s5 = dateTime.toString("yyyy/MM/dd HH:mm Z");

 

二、舉個實例:項目開發階段,有一個關於下單發貨的需求:如果今天下午 3 點前進行下單,那么發貨時間是明天, 如果今天下午 3 點后進行下單,那么發貨時間是后天,如果被確定的時間是周日,那么在此時間上再加 1 天為發貨時間。

    public static void main(String [] args){
        //下單時間為 orderTime
        DateTime orderTime = new DateTime();
        orderTime = new DateTime(2020, 8, 28, 16, 14, 0, 0);
        //返回發貨時間點
        Date date = DealUtils.calculateDistributionTimeByOrderCreateTime(orderTime.toDate());
        System.out.println(DateFormatUtils.format(date , "yyyy-MM-dd HH:mm:ss"));
    }


    // 定義一個常量當前天下的 15:00:00:00 時 分 秒 毫秒
    final static DateTime DISTRIBUTION_TIME_SPLIT_TIME = new DateTime().withTime(15,0,0,0);

    /**
     *  項目開發階段,有一個關於下單發貨的需求:如果今天下午 3 點前進行下單,那么發貨時間是明天,
     *  如果今天下午 3 點后進行下單,那么發貨時間是后天,如果被確定的時間是周日,那么在此時間上再加 1 天為發貨時間。
     *
     *
     * @param orderCreateTime  下單時間
     * @return  返回發貨時間
     */
    private static Date calculateDistributionTimeByOrderCreateTime(Date orderCreateTime){
        //定義一個DateTime
        DateTime orderCreateDateTime = new DateTime(orderCreateTime);
        //時間后推一天 並轉換成Date類
        Date tomorrow = orderCreateDateTime.plusDays(1).toDate();
        //時間后推兩天 並轉換成Date類
        Date theDayAfterTomorrow = orderCreateDateTime.plusDays(2).toDate();
        //下單時間與下午三點比  大於三點往后推兩天 小於等於則往后推一天   然后對推算后的發貨日期進行判斷是否為周日
        return  orderCreateDateTime.isAfter(new DateTime(orderCreateTime).withTime(15,0,0,0)) ?
                wrapDistributionTime(theDayAfterTomorrow) : wrapDistributionTime(tomorrow);
    }

    /**
     *  判斷日期是否為周日  若是 往后推一天  否則什么都不做
     * @param distributionTime
     * @return
     */
    private static Date wrapDistributionTime(Date distributionTime){
        DateTime currentDistributionDateTime = new DateTime(distributionTime);
        //日期往后推一天
        DateTime plusOneDay = currentDistributionDateTime.plusDays(1);
        //判斷是否為周末
        boolean isSunday = (DateTimeConstants.SUNDAY == currentDistributionDateTime.getDayOfWeek());
        //如果是周日 把推算后的日期返回  否則不處理
        return isSunday ? plusOneDay.toDate() : currentDistributionDateTime.toDate();
    }

【結論】DateTime 中提供了很多的方法,對於我們在開發過程中可以方便很多,減少程序出錯的可能性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM