將 Date 轉換為毫秒時間戳,計算差值後換算為天、時、分、秒。換算規則:
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDifferentExample {
public static void main(String[] args) {
String dateStart = "2013-02-19 09:29:58";
String dateStop = "2013-02-20 11:31:48";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date d1 = format.parse(dateStart);
Date d2 = format.parse(dateStop);
long diff = d2.getTime() - d1.getTime(); // 毫秒差
long diffDays = diff / (24 * 60 * 60 * 1000);
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffMinutes = diff / (60 * 1000) % 60;
long diffSeconds = diff / 1000 % 60;
System.out.printf("兩個時間相差:%d 天, %d 小時, %d 分鐘, %d 秒.%n",
diffDays, diffHours, diffMinutes, diffSeconds);
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出:
兩個時間相差:1 天, 2 小時, 1 分鐘, 50 秒.
Joda-Time 提供豐富的日期時間類型與直觀 API,線程安全、處理時區更可靠。
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Hours;
import org.joda.time.Minutes;
import org.joda.time.Seconds;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JodaDateDifferentExample {
public static void main(String[] args) {
String dateStart = "2013-02-19 09:29:58";
String dateStop = "2013-02-20 11:31:48";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date d1 = format.parse(dateStart);
Date d2 = format.parse(dateStop);
DateTime dt1 = new DateTime(d1);
DateTime dt2 = new DateTime(d2);
System.out.printf("兩個時間相差:%d 天, %d 小時, %d 分鐘, %d 秒.%n",
Days.daysBetween(dt1, dt2).getDays(),
Hours.hoursBetween(dt1, dt2).getHours() % 24,
Minutes.minutesBetween(dt1, dt2).getMinutes() % 60,
Seconds.secondsBetween(dt1, dt2).getSeconds() % 60);
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出:
兩個時間相差:1 天, 2 小時, 1 分鐘, 50 秒.
| 維度 | 原生 SDK | Joda-Time |
|---|---|---|
| 代碼複雜度 | 手動換算,易出錯 | 語義化 API,可讀性強 |
| 線程安全 | SimpleDateFormat 非線程安全 | 核心類不可變,線程安全 |
| 時區處理 | 繁瑣 | 原生支持 |
| 依賴 | 零依賴 | 需引入 joda-time.jar |
現代建議:JDK 8+ 請直接使用
java.time包(LocalDateTime、Duration、Period),它是 Joda-Time 設計的標準化升級版,無需第三方依賴。