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

忽略時間的日期工具類 DateUtil:解決時區偏移的天數轉換

     編輯:J2ME

設計初衷

業務常需「以天為單位」處理日期(如日曆展示、統計周期),卻受困於 Date 含時間、時區偏移導致跨天誤差。本工具類將日期統一折算為「自 1970-01-01 以來的天數」,屏蔽時間與時區影響。

核心常量與原理

private static final long MSEC_EVERYDAY = 86400000L; // 24*60*60*1000
private static final int rawOffset = TimeZone.getDefault().getRawOffset(); // 本地時區偏移(毫秒)

關鍵公式:day = (date.getTime() + rawOffset) / MSEC_EVERYDAY。加上偏移量後再除,確保同一「自然日」在不同時區得到相同天數。

核心 API

方法說明
dateToDay(Date)Date → 天數
dayToDate(int)天數 → Date(時間為當地午夜 00:00)
toDay()今日天數
getYMD(int)天數 → "YY/MM/DD"
getYM(int)天數 → "YYYY/MM"
getMD(int)天數 → "MM/DD"
getMonthFirstDay(int)該月 1 號對應天數
getYear/Month/Week(int)提取年/月/周序號(以 1971-01-03 為第一周週日)

使用示例

int today = DateUtil.toDay();           // 如 19823
String ymd = DateUtil.getYMD(today);    // "24/05/15"
int firstDay = DateUtil.getMonthFirstDay(today); // 月初天數

注意事項

  • 類非線程安全(共用 static Calendar),多線程環境建議改用 ThreadLocal<Calendar> 或 Java 8+ LocalDate。
  • 僅適用「忽略時間」場景;需精確到秒/毫秒時請直接用 Calendar / java.time。
  • 夏令時(DST)變更日可能導致該日偏移 1 小時,極少數情況下影響天數計算,生產環境建議引入 java.time.ZoneId 處理。

現代替代方案

Java 8+ 推薦使用 LocalDate + ChronoUnit.DAYS.between(EPOCH, localDate),天然無時區、不可變、線程安全,代碼更簡潔:

long days = ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), LocalDate.now(ZoneId.systemDefault()));
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved