毫秒轉日期
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 替代隱式時區依賴。
遷移清單