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

Java Date 類深度解析:從基礎用法到格式化實戰

     編輯:Java 相關知識

引言:Date 類的演進歷程

Java 的 java.util.Date 類自 JDK 1.0 起隨平台發展至今。早期版本僅提供簡單的獲取年、月、日等方法,但這些方法因國際化支持不足而備受詬病,後來在 JDK 1.1 中被標記為過時,並遷移至 Calendar 類。現今,Date 本質上是一個輕量級包裝器,內部封裝一個 long 值,代表從 GMT 時間 1970 年 1 月 1 日 00:00:00 起經過的毫秒數。

創建 Date 對象與獲取時間戳

最常見的用法是使用無參構造函數,它會自動調用 System.currentTimeMillis() 獲取當前系統時間:

import java.util.Date;

public class DateExample {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date.getTime()); // 輸出毫秒數,例如 1001803809710
    }
}

此毫秒值是跨平台、時區無關的絕對時間基準,適合存儲、傳輸及比較。

使用 SimpleDateFormat 實現自定義格式化

若需將時間戳轉為人類可讀格式,java.text.SimpleDateFormat 是首選工具。通過模式字符串可精確控制輸出樣式:

import java.text.SimpleDateFormat;
import java.util.Date;

public class FormatExample {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("EEEE-MMMM-dd-yyyy");
        Date now = new Date();
        System.out.println(sdf.format(now)); // 例如:Saturday-September-29-2001
    }
}

模式字母重複次數決定輸出長度:EEEE 顯示完整星期名,EE 則為縮寫;同理 MMMM 對比 MM,yyyy 對比 yy。

解析字符串為 Date 對象

反向操作同樣簡單,調用 parse() 方法並捕獲 ParseException:

import java.text.SimpleDateFormat;
import java.util.Date;

public class ParseExample {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
        String input = "9-29-2001";
        try {
            Date date = sdf.parse(input);
            System.out.println(date.getTime()); // 輸出對應毫秒數
        } catch (Exception e) {
            System.err.println("解析失敗:" + e.getMessage());
        }
    }
}

內建日期時間格式化風格

DateFormat.getDateTimeInstance() 提供四種預定義風格,無需手寫模式即可獲得本地化輸出:

import java.text.DateFormat;
import java.util.Date;

public class BuiltinFormatExample {
    public static void main(String[] args) {
        Date now = new Date();
        System.out.println("SHORT:    " + DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(now));
        System.out.println("MEDIUM:   " + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(now));
        System.out.println("LONG:     " + DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(now));
        System.out.println("FULL:     " + DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(now));
    }
}

輸出示例(視區域設置而定):

  • SHORT: 9/29/01 8:44 PM
  • MEDIUM: Sep 29, 2001 8:44:45 PM
  • LONG: September 29, 2001 8:44:45 PM EDT
  • FULL: Saturday, September 29, 2001 8:44:45 PM EDT

最佳實踐提醒

  • 線程安全:SimpleDateFormat 非線程安全,多線程環境下請使用 ThreadLocal 或 Java 8+ 的 DateTimeFormatter。
  • 時區處理:Date 本身無時區概念,格式化/解析時默認使用 JVM 默認時區,跨時區應用請顯式設置 TimeZone。
  • 現代替代方案:新項目建議優先使用 Java 8 引入的 java.time 包(LocalDateTime、ZonedDateTime、DateTimeFormatter),API 設計更符合直覺且線程安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved