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

Java 日期時間處理實戰:String、Date、Timestamp 互轉完整指南

     編輯:Java 程式設計入門

前言

在 Java 開發中,日期時間與字串的相互轉換是高頻剛需。雖然 Java 8 引入了全新的 java.time 套件,但大量既有專案仍使用 java.util.Date、java.sql.Timestamp 與 SimpleDateFormat。本文整理經典轉換範例,涵蓋格式化、解析、多種輸出風格與時間戳處理,並補充現代 API 替代建議。

一、核心類別速查

類別套件用途
Datejava.util日期時間基礎類(毫秒精度)
Timestampjava.sql資料庫時間戳(納秒精度,繼承 Date)
SimpleDateFormatjava.text格式化/解析日期(非執行緒安全)
DateFormatjava.text抽象基類,提供預設風格常數

二、完整轉換範例程式碼

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateIO {

    public static void main(String[] args) {
        DateIO demo = new DateIO();

        // 1. String -> Date
        Date date = demo.strToDate("2013-04-01");

        // 2. Date -> String (多種風格)
        demo.dateToStr(date);

        // 3. Timestamp(millis) -> String
        demo.timestampToStr(System.currentTimeMillis());

        // 4. Date -> Timestamp
        demo.strToTimestamp(new Date());
    }

    // String 轉 Date
    public Date strToDate(String strDate) {
        // 固定格式:yyyy-MM-dd
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = format.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("date: " + date);
        return date;
    }

    // Date 轉 String(展示多種內建風格)
    public String dateToStr(Date date) {
        DateFormat format;
        String str;

        // 自訂格式:年-月-日
        format = new SimpleDateFormat("yyyy-MM-dd");
        str = format.format(date);
        System.out.println("自訂 yyyy-MM-dd: " + str);

        // SHORT:完全數字,如 2013/4/1
        format = DateFormat.getDateInstance(DateFormat.SHORT);
        str = format.format(date);
        System.out.println("SHORT: " + str);

        // MEDIUM:月份縮寫,如 2013年4月1日
        format = DateFormat.getDateInstance(DateFormat.MEDIUM);
        str = format.format(date);
        System.out.println("MEDIUM: " + str);

        // FULL:完整風格,如 2013年4月1日 星期一
        format = DateFormat.getDateInstance(DateFormat.FULL);
        str = format.format(date);
        System.out.println("FULL: " + str);

        return str;
    }

    // Timestamp (long 毫秒) -> String
    public String timestampToStr(Long timestamp) {
        // 格式:yyyy-MM-dd HH:mm:ss(不顯示毫秒)
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = df.format(timestamp);
        System.out.println("Timestamp->String: " + str);
        return str;
    }

    // Date -> Timestamp
    public Timestamp strToTimestamp(Date date) {
        // 先格式化為不含毫秒的字串,再轉 Timestamp
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = df.format(date);
        Timestamp ts = Timestamp.valueOf(time);
        System.out.println("Date->Timestamp: " + ts);
        return ts;
    }
}

三、關鍵細節解析

1. 格式化模式字元對照

  • y:年;M:月;d:日
  • H:24小時制;h:12小時制
  • m:分;s:秒;S:毫秒

2. SimpleDateFormat 非執行緒安全

請勿將 SimpleDateFormat 實例定義為 static 共用。多執行緒環境下應使用 ThreadLocal 或每次新建實例,或改用 Java 8 DateTimeFormatter(不可變、執行緒安全)。

3. Timestamp.valueOf(String) 要求格式

必須符合 yyyy-MM-dd HH:mm:ss[.fffffffff] 格式,故示例中先用 SimpleDateFormat 格式化後再轉換。

四、Java 8+ 現代化替代方案(推薦)

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

// String -> LocalDateTime
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.parse("2023-08-15 14:30:00", fmt);

// LocalDateTime -> String
String str = ldt.format(fmt);

// LocalDateTime <-> Timestamp (資料庫交互)
Timestamp ts = Timestamp.valueOf(ldt);
LocalDateTime ldt2 = ts.toLocalDateTime();

// 時區處理
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Instant instant = zdt.toInstant(); // 與 Date.from()/toInstant() 互通

五、常見坑點與避雷指南

  • 時區問題: Date 內部存儲 UTC 毫秒數,格式化輸出受預設時區影響,跨時區系統請顯式指定 TimeZone
  • 年份模式: 使用 yyyy 而非 YYYY(週年),避免跨年週邊日期錯誤
  • 效能: 高頻格式化場景請複用 DateTimeFormatter 或使用 FastDateFormat (Apache Commons Lang)
  • 資料庫映射: MyBatis/JPA 建議直接使用 LocalDateTime 或 Instant,避免手動轉 Timestamp

總結

掌握 String ⇄ Date ⇄ Timestamp 互轉是 Java 後端開發基本功。維護舊專案時熟練使用 SimpleDateFormat;新專案請毫不猶豫擁抱 java.time,享受不可變、執行緒安全、API 豐富的現代體驗。

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