首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 時間處理:毫秒與日期互轉、日期差值計算實用代碼

     編輯:Java 相關知識

毫秒轉日期

long now = System.currentTimeMillis();
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(now);
System.out.println(fmt.format(cal.getTime()));  // 2024-05-20 14:30:45

日期字符串轉毫秒

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String start = "2011-09-20 12:30:45";
String end   = "2011-10-20 06:30:00";
long startMs = sdf.parse(start).getTime();
long endMs   = sdf.parse(end).getTime();

計算天數差

long dayCount = (endMs - startMs) / (24 * 3600 * 1000);
System.out.println(dayCount);  // 30

現代化建議:Java 8+ java.time API

// 毫秒 → LocalDateTime
Instant instant = Instant.ofEpochMilli(now);
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

// 字符串 → LocalDateTime → 毫秒
LocalDateTime startLdt = LocalDateTime.parse("2011-09-20T12:30:45");
long startMs = startLdt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();

// 精確天數差(考慮 DST、閏秒)
long days = ChronoUnit.DAYS.between(startLdt.toLocalDate(), endLdt.toLocalDate());

關鍵優勢

  • 線程安全:DateTimeFormatter 不可變,可靜態共享;SimpleDateFormat 非線程安全。
  • 不可變對象:避免意外修改導致邏輯錯誤。
  • 豐富 API:ChronoUnit、Period、Duration 精確計算差值。
  • 時區處理:明確的 ZoneId 替代隱式時區依賴。

遷移清單

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
舊 API新 API
java.util.Datejava.time.Instant / LocalDateTime
java.util.Calendarjava.time.ZonedDateTime / LocalDate
SimpleDateFormatDateTimeFormatter
Date.getTime()Instant.toEpochMilli()
手動計算差值ChronoUnit.between / Period / Duration