1 <dependency> 2 <groupId>joda-time</groupId> 3 <artifactId>joda-time</artifactId> 4 <version>2.6</version> 5 </dependency>
1 Joda-Time 2 3 Home:http://joda-time.sourceforge.net/ 4 5 JavaDoc:http://joda-time.sourceforge.net/apidocs/index.html 6 7 直接看代碼,這是在網上和根據API整理的一些例子,使用時看例子就可以了 8 9 package com.yan.joda; 10 11 import java.util.Calendar; 12 import java.util.Date; 13 import java.util.Locale; 14 import org.joda.time.DateTime; 15 import org.joda.time.Days; 16 import org.joda.time.LocalDate; 17 import org.joda.time.format.DateTimeFormat; 18 import org.joda.time.format.DateTimeFormatter; 19 20 public class JodaTest { 21 22 public static void main(String[] args) { 23 //初始化時間 24 DateTime dateTime=new DateTime(2012, 12, 13, 18, 23,55); 25 26 // 年,月,日,時,分,秒,毫秒 27 DateTime dt3 = new DateTime(2011, 2, 13, 10, 30, 50, 333);// 2010年2月13日10點30分50秒333毫秒 28 29 //下面就是按照一點的格式輸出時間 30 String str2 = dateTime.toString("MM/dd/yyyy hh:mm:ss.SSSa"); 31 String str3 = dateTime.toString("dd-MM-yyyy HH:mm:ss"); 32 String str4 = dateTime.toString("EEEE dd MMMM, yyyy HH:mm:ssa"); 33 String str5 = dateTime.toString("MM/dd/yyyy HH:mm ZZZZ"); 34 String str6 = dateTime.toString("MM/dd/yyyy HH:mm Z"); 35 36 DateTimeFormatter format = DateTimeFormat .forPattern("yyyy-MM-dd HH:mm:ss"); 37 //時間解析 38 DateTime dateTime2 = DateTime.parse("2012-12-21 23:22:45", format); 39 40 //時間格式化,輸出==> 2012/12/21 23:22:45 Fri 41 String string_u = dateTime2.toString("yyyy/MM/dd HH:mm:ss EE"); 42 System.out.println(string_u); 43 44 //格式化帶Locale,輸出==> 2012年12月21日 23:22:45 星期五 45 String string_c = dateTime2.toString("yyyy年MM月dd日 HH:mm:ss EE",Locale.CHINESE); 46 System.out.println(string_c); 47 48 DateTime dt1 = new DateTime();// 取得當前時間 49 50 // 根據指定格式,將時間字符串轉換成DateTime對象,這裡的格式和上面的輸出格式是一樣的 51 DateTime dt2 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime("2012-12-26 03:27:39"); 52 53 //計算兩個日期間隔的天數 54 LocalDate start=new LocalDate(2012, 12,14); 55 LocalDate end=new LocalDate(2013, 01, 15); 56 int days = Days.daysBetween(start, end).getDays(); 57 58 //計算兩個日期間隔的小時數,分鐘數,秒數 59 60 //增加日期 61 DateTime dateTime1 = DateTime.parse("2012-12-03"); 62 dateTime1 = dateTime1.plusDays(30); 63 dateTime1 = dateTime1.plusHours(3); 64 dateTime1 = dateTime1.plusMinutes(3); 65 dateTime1 = dateTime1.plusMonths(2); 66 dateTime1 = dateTime1.plusSeconds(4); 67 dateTime1 = dateTime1.plusWeeks(5); 68 dateTime1 = dateTime1.plusYears(3); 69 70 // Joda-time 各種操作..... 71 dateTime = dateTime.plusDays(1) // 增加天 72 .plusYears(1)// 增加年 73 .plusMonths(1)// 增加月 74 .plusWeeks(1)// 增加星期 75 .minusMillis(1)// 減分鐘 76 .minusHours(1)// 減小時 77 .minusSeconds(1);// 減秒數 78 .minusMonths(2);// 減月 79 //判斷是否閏月 80 DateTime dt4 = new DateTime(); 81 org.joda.time.DateTime.Property month = dt4.monthOfYear(); 82 System.out.println("是否閏月:" + month.isLeap()); 83 84 //取得 3秒前的時間 85 DateTime dt5 = dateTime1.secondOfMinute().addToCopy(-3); 86 dateTime1.getSecondOfMinute();// 得到整分鐘後,過的秒鐘數 87 dateTime1.getSecondOfDay();// 得到整天後,過的秒鐘數 88 dateTime1.secondOfMinute();// 得到分鐘對象,例如做閏年判斷等使用 89 90 // DateTime與java.util.Date對象,當前系統TimeMillis轉換 91 DateTime dt6 = new DateTime(new Date()); 92 Date date = dateTime1.toDate(); 93 DateTime dt7 = new DateTime(System.currentTimeMillis()); 94 dateTime1.getMillis(); 95 96 Calendar calendar = Calendar.getInstance(); 97 dateTime = new DateTime(calendar); 98 } 99 } 100 101 102 103 下面是一個小例子用來計算小寶寶從出生到現在總共的天數小時數等,首先用jdk的類去做,不用joda,然後再用joda去做,以做比較 104 105 用jdk做的例子,這裡算的從出生到現在的時間間隔是准確的,如果是輸入的某天來算的話就不是很准確,多一秒就算一天。可以看到用jdk去做的話,要寫的代碼還是挺繁瑣的。 106 107 import java.text.SimpleDateFormat; 108 import java.util.Calendar; 109 import java.util.Date; 110 import java.util.Scanner; 111 112 public class CalBaby { 113 private final static String birthday = "2012-3-10 08:20:55"; 114 /** 115 * @param args 116 */ 117 public static void main(String[] args) { 118 while(true){ 119 String format1 = "yyyy-MM-dd"; 120 String format2 = "yyyy-MM-dd HH:mm:ss"; 121 Scanner s = new Scanner(System.in); 122 System.out.println("########################################"); 123 cutTwoDateToDay(convertToDate1(birthday,format2),new Date(),false); 124 System.out.println("請選擇操作"); 125 System.out.println("請輸入日期(格式例如:2012-11-08)"); 126 System.out.println("########################################"); 127 String endDateStr = s.nextLine(); 128 Date endDate = convertToDate1(endDateStr,format1); 129 if(endDate == null){ 130 System.out.println("輸入格式錯誤!請重新輸入."); 131 continue; 132 } 133 boolean inputFlag = true; 134 cutTwoDateToDay(convertToDate1(birthday,format2),endDate,inputFlag); 135 } 136 137 } 138 139 /** 140 * 計算兩個日期之間的差距天數 141 * 142 * @param a 143 * @param b 144 * @return 145 */ 146 public static void cutTwoDateToDay(Date beginDate, Date endDate,boolean inputFlag) { 147 Calendar calendar = Calendar.getInstance(); 148 long intervalDays = 0; 149 calendar.setTime(beginDate); 150 long begin = calendar.getTimeInMillis(); 151 calendar.setTime(endDate); 152 long end = calendar.getTimeInMillis(); 153 long totalM = end - begin; 154 System.out.println((end -begin)); 155 System.out.println(24*60*60*1000); 156 intervalDays = totalM /(24*60*60*1000); 157 long intervalHours = (totalM - (intervalDays*24*60*60*1000))/(60*60*1000); 158 long intervalMin = (totalM - intervalDays * (24*60*60*1000) - intervalHours*60*60*1000)/(60*1000); 159 if(inputFlag){ 160 if(totalM > 0L && totalM %(24*60*60*1000) > 0L){ 161 intervalDays = intervalDays + 1; 162 } 163 System.out.println("寶寶從出生到"+formatDate(endDate,"yyyy-MM-dd")+"已經"+intervalDays+"天了"); 164 }else{ 165 System.out.println("寶寶來到這個世界已經"+intervalDays+"天"+intervalHours+"小時"+intervalMin+"分鐘了"); 166 } 167 168 } 169 170 /** 171 * 將字符串日期轉換為Date yyyy-MM-dd HH:mm:ss yyyy-MM-dd 172 * 173 * @param s 174 * @return 175 */ 176 public static Date convertToDate1(String s,String format) { 177 178 if (s == null) { 179 return null; 180 } 181 try { 182 SimpleDateFormat df = new SimpleDateFormat(format); 183 return df.parse(s); 184 } catch (Exception e) { 185 return null; 186 } 187 } 188 189 public static String formatDate(Date date, String strType) 190 { 191 if (date == null) 192 { 193 return null; 194 } 195 196 SimpleDateFormat sdf = new SimpleDateFormat(strType); 197 try 198 { 199 return sdf.format(date); 200 } 201 catch (Exception e) 202 { 203 return null; 204 } 205 } 206 } 207 208 209 210 下面是用joda來做,用這個來做就簡單的多了,而且也很准確。 211 212 Java代碼 收藏代碼 213 214 import java.util.Scanner; 215 import org.joda.time.DateTime; 216 import org.joda.time.Days; 217 import org.joda.time.LocalDate; 218 import org.joda.time.format.DateTimeFormat; 219 import org.joda.time.format.DateTimeFormatter; 220 221 public class CalBabyJoda { 222 223 private final static String birthday = "2012-3-10 08:20:55"; 224 225 public static void main(String[] args) { 226 while(true){ 227 Scanner s = new Scanner(System.in); 228 System.out.println("########################################"); 229 DateTimeFormatter format1 = DateTimeFormat .forPattern("yyyy-MM-dd HH:mm:ss"); 230 DateTimeFormatter format2 = DateTimeFormat .forPattern("yyyy-MM-dd"); 231 DateTime startDateTime = DateTime.parse(birthday, format1); 232 System.out.println("寶寶來到這個世界已經"); 233 calDateToDay(startDateTime,new DateTime()); 234 System.out.println("如選擇其它日期請輸入(格式例如:2012-11-08 14:24:54或著2012-11-08)"); 235 System.out.println("########################################"); 236 String endDate = s.nextLine(); 237 DateTime endDateTime = null; 238 try{ 239 endDateTime = DateTime.parse(endDate,format1); 240 }catch(Exception e){ 241 try{ 242 endDateTime = DateTime.parse(endDate,format2); 243 }catch(Exception e1){ 244 System.out.println("輸入格式錯誤!請重新輸入."); 245 continue; 246 } 247 } 248 System.out.println("寶寶從出生到" + endDateTime.toString("yyyy-MM-dd HH:mm:ss") + "已經"); 249 calDateToDay(startDateTime,endDateTime); 250 } 251 } 252 253 public static void calDateToDay(DateTime startDateTime,DateTime endDateTime){ 254 255 LocalDate start=new LocalDate(startDateTime); 256 LocalDate end=new LocalDate(endDateTime); 257 Days days = Days.daysBetween(start, end); 258 int intervalDays = days.getDays(); 259 int intervalHours = endDateTime.getHourOfDay() - startDateTime.getHourOfDay(); 260 int intervalMinutes = endDateTime.getMinuteOfHour() - startDateTime.getMinuteOfHour(); 261 int intervalSeconds = endDateTime.getSecondOfMinute() - startDateTime.getSecondOfMinute(); 262 263 264 if(intervalSeconds < 0){ 265 intervalMinutes = intervalMinutes -1; 266 intervalSeconds = 60 + intervalSeconds; 267 } 268 269 if(intervalMinutes < 0){ 270 intervalHours = intervalHours -1; 271 intervalMinutes = 60 + intervalMinutes; 272 } 273 274 if(intervalHours < 0){ 275 intervalDays = intervalDays -1; 276 intervalHours = 24 + intervalHours; 277 } 278 279 System.out.println(intervalDays + "天" + intervalHours + 280 "小時" + intervalMinutes + "分鐘" + intervalSeconds + "秒"); 281 System.out.println("############################"); 282 } 283 284 }