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

Java 獲取當前日期前後 N 天的工具方法:基於 Calendar 的線程安全實現

     編輯:Java 相關知識

核心工具方法

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 獲取相對於當前時間的日期
 * @param daysOffset 正數=未來N天,負數=過去N天,0=今天
 * @return Timestamp 對象(含時分秒),可直接寫入數據庫
 */
public static Timestamp getRelativeDate(int daysOffset) {
    Calendar cal = Calendar.getInstance();  // 線程安全:每次調用創建新實例
    cal.add(Calendar.DAY_OF_MONTH, daysOffset);
    Date date = cal.getTime();
    
    // 格式化為 "yyyy-MM-dd HH:mm:ss" 再解析為 Timestamp,去除毫秒差異
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String formatted = sdf.format(date);
    return Timestamp.valueOf(formatted);
}

關鍵點解析

  1. Calendar 線程安全:Calendar.getInstance() 返回新實例,避免 SimpleDateFormat 非線程安全問題(此處 SimpleDateFormat 也是局部變量,安全)。
  2. Calendar.DAY_OF_MONTH:自動處理月份進位/跨年/閏年,比手動加減毫秒值可靠。
  3. 返回 Timestamp:JDBC 標準類型,直接用於 PreparedStatement.setTimestamp(),避免 java.util.Date 轉換麻煩。
  4. 格式化再解析:將毫秒截斷至秒級,確保數據庫存儲一致性(部分 DB 不支持毫秒或精度不同)。

現代化替代:Java 8+ java.time API(強烈推薦)

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.sql.Timestamp;

/**
 * Java 8+ 現代寫法:不可變、線程安全、API 清晰
 */
public static Timestamp getRelativeDateModern(int daysOffset) {
    LocalDateTime ldt = LocalDateTime.now().plusDays(daysOffset);
    return Timestamp.valueOf(ldt);  // LocalDateTime 直接轉 Timestamp,無需格式化字符串
}

優勢:無 SimpleDateFormat 開銷、不可變對象天然線程安全、鏈式調用可讀性強、支持時區 .atZone(ZoneId.of("Asia/Shanghai"))。

使用示例

// 3 天前
Timestamp threeDaysAgo = getRelativeDate(-3);
// 明天
Timestamp tomorrow = getRelativeDate(1);
// 今天 00:00:00
Timestamp todayStart = getRelativeDate(0); // 注意:此方法返回當前時刻,非當天起始
// 如需當天起始:
LocalDateTime todayZero = LocalDate.now().atStartOfDay();

避坑指南

  • 不要共享 Calendar/SimpleDateFormat 實例:作為局部變量創建或用 ThreadLocal 緩存。
  • 時區一致性:服務器、JVM、數據庫會話時區必須一致(建議統一 UTC 存儲,展示層轉換)。
  • 業務語義清晰:「前 N 天」含不含今天?方法參數命名用 daysOffset 明確語義,文檔註釋說明正負含義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved