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

Java Date 常用工具方法集錦(下):間隔天數、字符串轉換、數據庫日期類型映射

     編輯:Java 相關知識

續上篇,聚焦兩日期間隔計算、String/Date/Long 三向轉換、按年月周解析日期、星期判斷、Java 與 Oracle/SQL Server 日期類型映射、Date⇄Timestamp 轉換實用代碼。

6. 計算兩日期間隔天數

傳入 Calendar

public int getIntervalDays(Calendar start, Calendar end) {
    if (start.after(end)) { Calendar t = start; start = end; end = t; }
    long diff = end.getTimeInMillis() - start.getTimeInMillis();
    return (int) (diff / (1000 * 60 * 60 * 24));
}

傳入 Date

public int getIntervalDays(Date start, Date end) {
    if (start.after(end)) { Date t = start; start = end; end = t; }
    long diff = end.getTime() - start.getTime();
    return (int) (diff / (1000 * 60 * 60 * 24));
}

精確跨年算法(推薦)

public int getDaysBetween(Calendar d1, Calendar d2) {
    if (d1.after(d2)) { Calendar t = d1; d1 = d2; d2 = t; }
    int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
    int y2 = d2.get(Calendar.YEAR);
    if (d1.get(Calendar.YEAR) != y2) {
        d1 = (Calendar) d1.clone();
        do {
            days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);
            d1.add(Calendar.YEAR, 1);
        } while (d1.get(Calendar.YEAR) != y2);
    }
    return days;
}

應用場景:郵箱「三周內郵件」查詢 → 當前時間減 21 天得到閾值,轉 Long 比較高效。

7. String ⇄ Date ⇄ Long 三向轉換

// String → Date → Long
SimpleDateFormat sdf = new SimpleDateFormat("M/dd/yyyy hh:mm:ss a", Locale.US);
Date d = sdf.parse("5/13/2003 10:31:37 AM");
long lv = d.getTime();

// Long → String
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = fmt.format(new Date(lv));

8. 通過年月周/星期解析日期

// "2003-05 5 星期五" → 日期
SimpleDateFormat f1 = new SimpleDateFormat("yyyy-MM w E");
Date d = f1.parse("2003-05 5 星期五");
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(d));

// 判斷星期幾
SimpleDateFormat f2 = new SimpleDateFormat("E");
System.out.println(f2.format(new Date())); // 如 "週六"

9. Java 與數據庫日期類型映射

數據庫類型Java 類型說明
Oracle DATEjava.sql.Date僅年月日
SQL Server DATETIMEjava.sql.Timestamp年月日時分秒毫秒
MySQL DATETIMEjava.sql.Timestamp / LocalDateTime推薦 Timestamp 或 Java 8 新類型
// 通用工具方法
public static java.sql.Timestamp string2Time(String s) throws ParseException {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.ENGLISH);
    df.setLenient(false);
    return new java.sql.Timestamp(df.parse(s).getTime());
}
public static java.sql.Date string2Date(String s) throws ParseException {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
    df.setLenient(false);
    return new java.sql.Date(df.parse(s).getTime());
}

10. Date ⇄ Timestamp 互轉

// Date → Timestamp
Timestamp ts = new Timestamp(new Date().getTime());

// Timestamp → Date (自動截斷 nanos)
Date d = new Date(ts.getTime());

// 字符串雙向演示
String sDate = "2005-8-18";
String sTs   = "2005-8-18 14:21:12.123";
System.out.println("Date: " + string2Date(sDate));
System.out.println("Timestamp: " + string2Time(sTs));

遷移建議

所有新代碼請直接使用 java.time.LocalDate、LocalDateTime、Instant、Duration、Period,配合 DateTimeFormatter 完成上述所有場景,徹底解決線程安全、時區、不可變性等歷史包袱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved