1. 程式人生 > >Joda-Time研究

Joda-Time研究

結束 區間 方式 似的 ets 計算 日期 轉換 第一天

最近在做一個數據統計的需求,需要多種對時間的計算。由於Calendar對時間的計算實在是過於復雜繁瑣,因此就想尋求一種比較簡單粗暴的方式。很幸運,找到了joda。下面是一些代碼實例。
/**

  • 設置一個日期對象
    */
    public void setADate() {
    //利用jdk的Calendar對象
    Calendar calendar = Calendar.getInstance();
    calendar.set(2019, Calendar.JANUARY, 18, 10, 32, 0);
    //利用joda
    DateTime dateTime = new DateTime(2019,1,18,10,32,0,0);
    }

    /**

  • 獲取當前日期的前5天*/

    @Test
    br/>*/
    @Test
    //利用jdk的Calendar對象
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(new Date());
    calendar.add(Calendar.DATE,-5);
    Date date = calendar.getTime();
    System.out.println(simpleDateFormat.format(date));
    //利用joda
    DateTime dateTime = new DateTime();
    System.out.println(dateTime.minusDays(5).toString("yyyy-MM-dd HH:mm:ss",Locale.CHINESE));
    }

    /**

  • 獲取當前時間的後五天*/
    @Test
    br/>*/
    @Test
    //利用jdk的Calendar對象
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(new Date());
    calendar.add(Calendar.DATE,5);
    Date date = calendar.getTime();
    System.out.println(simpleDateFormat.format(date));
    //利用joda
    DateTime dateTime = new DateTime();
    System.out.println(dateTime.plusDays(5).toString("yyyy-MM-dd HH:mm:ss",Locale.CHINESE));
    }

可以看出,利用joda確實是比calendar快了很多,類似的獲取當前時間的後幾個月有plusMonths(),後幾年plusYears(),後幾個小時plusHours()等等甚至可以精確到毫秒。若要獲取之前的時間,只需要將plus換成minus即可。當然joda的計算功能遠不止如此,它可以很靈活的計算出任何你想要的或者想進行對比的時間。看下面這個例子。
@Test
br/>當然joda的計算功能遠不止如此,它可以很靈活的計算出任何你想要的或者想進行對比的時間。看下面這個例子。
@Test
String formatString = "yyyy-MM-dd HH:mm:ss";

    DateTime dateTime = new DateTime();
    // 獲取當前時間月的第一天
    LocalDate firstDayOfMonth = dateTime.toLocalDate().withDayOfMonth(1);
    System.out.println("本月第一天日期:"+ firstDayOfMonth.toString(formatString,Locale.CHINESE));

    // 獲取當前周的周一和周末
    LocalDate firstDayOfWeek = dateTime.toLocalDate().withDayOfWeek(1);
    LocalDate lastDayOfWeek = dateTime.toLocalDate().withDayOfWeek(7);
    System.out.println("本周第一天日期:"+ firstDayOfWeek.toString(formatString,Locale.CHINESE));
    System.out.println("本周最後一天日期:"+ lastDayOfWeek.toString(formatString,Locale.CHINESE));

    // 當前月的第一天和最後一天
    DateTime firstDayOfCurrentMonth = dateTime.dayOfMonth().withMinimumValue();
    DateTime lastDayOfCurrentMonth = dateTime.dayOfMonth().withMaximumValue();
    System.out.println("本月第一天日期:"+ firstDayOfCurrentMonth.toString(formatString,Locale.CHINESE));
    System.out.println("本月最後一天日期:"+ lastDayOfCurrentMonth.toString(formatString,Locale.CHINESE));

    // 當前年的第一天和最後一天
    DateTime firstDayOfCurrentYear = dateTime.dayOfYear().withMinimumValue();
    DateTime lastDayOfCurrentYear = dateTime.dayOfYear().withMaximumValue();
    System.out.println("本年第一天日期:"+ firstDayOfCurrentYear.toString(formatString,Locale.CHINESE));
    System.out.println("本年最後一天日期:"+ lastDayOfCurrentYear.toString(formatString,Locale.CHINESE));

    DateTime begin = new DateTime(1994, 10, 1, 0, 0, 0,0);
    Duration duration = new Duration(begin, dateTime);

    // 兩個時間之間 所差秒
    System.out.println(begin.toString(formatString) + " 與 "  + dateTime.toString(formatString) + " 相差的秒:" + duration.getStandardSeconds());
    //計算區間天數  ,小時,秒
    Period p = new Period(new DateTime(1994, 10, 1, 0, 0, 0,0),new DateTime(), PeriodType.days());
    System.out.println("相隔的天:"+p.getDays());

    // 計算之前月份的時間操作
    LocalDate d = new DateTime().toLocalDate();
    // 上個月(可以是之前的任意月)的最後一天
    LocalDate lastDayOfPreviousMonth = d.minusMonths(1).dayOfMonth().withMaximumValue();

    LocalDate.Property e = d.minusWeeks(1).dayOfWeek();
    System.out.println("上周的周一:" + e.withMinimumValue().toString(formatString, Locale.CHINESE));
    System.out.println("上周的周日:" + e.withMaximumValue().toString(formatString, Locale.CHINESE));

    //漢字形式標識今年和去年時間
    System.out.println("漢字形式:" + dateTime.minusYears(0).year().getAsText(Locale.CHINESE));
    System.out.println("漢字形式:" + dateTime.minusYears(1).monthOfYear().getAsText(Locale.CHINESE));
    System.out.println("漢字形式:"+ dateTime.minusYears(1).dayOfMonth().getAsText(Locale.CHINESE));
    System.out.println("漢字形式:" + dateTime.minusYears(1).dayOfWeek().getAsText(Locale.CHINESE));

    // 判斷是否是閏年 閏月
    System.out.println("是否閏月:" + dateTime.monthOfYear().isLeap());
    System.out.println("是否閏年:" + dateTime.year().isLeap());
    System.out.println("去年是否閏年:" + dateTime.minusYears(1).year().isLeap());

    //獲取現在距離今天結束還有多久時間
    System.out.println( dateTime.millisOfDay().withMaximumValue().getMillis() - dateTime.getMillis());

    //10 天後 那周的周一是
    System.out.println("十天後的那周的周一是:" + dateTime.plusDays(10).dayOfWeek().withMinimumValue().toString(formatString));

    // DateTime與java.util.Date對象,當前系統TimeMillis轉換
    DateTime temp1 = new DateTime(new Date());
    Date temp2 = dateTime.toDate();
    DateTime temp3 = new DateTime(System.currentTimeMillis());

    Calendar calendar = Calendar.getInstance();
    DateTime  temp4 = new DateTime(calendar);
}

總之,這個joda用起來比較快速,也比較靈活。是一個上手很快的工具。

Joda-Time研究