值得一提的是該功能被整合到Java 8 中 ,被稱爲java8 新特新之一 。這意味着不用到包
<!-- 時間操做組件 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>html
不過下面的代碼寫的更清楚一點
來自:http://ylq365.iteye.com/blog/1769680
joda-time的使用
博客分類:Joda-Time
Home:http://joda-time.sourceforge.net/
JavaDoc:http://joda-time.sourceforge.net/apidocs/index.html
直接看代碼,這是在網上和根據API整理的一些例子,使用時看例子就能夠了
java
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去作的話,要寫的代碼仍是挺繁瑣的。 Java代碼 收藏代碼 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來作,用這個來作就簡單的多了,並且也很準確。
api
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("############################"); } }