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

Java 日期時間處理:獲取年、月、日、時、分、秒完整指南

     編輯:Java 相關知識

前言

Java 中處理日期時間常見需求包括取得當前時間各欄位、解析指定格式字串、格式化輸出等。本文示範使用 java.util.Calendar 與 java.text.SimpleDateFormat 完成基本操作,並補充現代 java.time 套件的建議用法。

傳統 Calendar API 範例

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

public class DateTimeDemo {

    public static void main(String[] args) {
        System.out.println("=== 獲取當前日期時間 ===");
        printCurrentDateTime();

        System.out.println("\n=== 解析指定字串日期時間 ===");
        printCustomDateTime("2013-11-10 18:45:39");
    }

    // 獲取當前時間各欄位
    private static void printCurrentDateTime() {
        Calendar cal = Calendar.getInstance();
        printCalendarFields(cal);
    }

    // 解析指定格式字串並獲取欄位
    private static void printCustomDateTime(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar cal = Calendar.getInstance();
        try {
            Date date = sdf.parse(dateStr);
            cal.setTime(date);
        } catch (ParseException e) {
            System.err.println("日期解析失敗:" + e.getMessage());
            return;
        }
        printCalendarFields(cal);
    }

    // 統一輸出 Calendar 各欄位
    private static void printCalendarFields(Calendar cal) {
        int year       = cal.get(Calendar.YEAR);
        int month      = cal.get(Calendar.MONTH) + 1; // 月份從 0 開始
        int day        = cal.get(Calendar.DAY_OF_MONTH);
        int hour       = cal.get(Calendar.HOUR_OF_DAY); // 24 小制
        int minute     = cal.get(Calendar.MINUTE);
        int second     = cal.get(Calendar.SECOND);

        System.out.printf("年:%d%n月:%d%n日:%d%n時:%d%n分:%d%n秒:%d%n",
                year, month, day, hour, minute, second);
    }
}

關鍵注意事項

  • 月份從 0 開始:Calendar.JANUARY = 0,取得月份時需 +1。
  • 執行緒不安全:SimpleDateFormat 非執行緒安全,多執行緒環境請使用 ThreadLocal 或每次新建實例。
  • 時區影響:Calendar.getInstance() 使用系統預設時區,跨時區應用需明確設定 setTimeZone()。

現代 Java 8+ java.time 套件(強烈建議)

Java 8 引入 java.time 套件(JSR-310),API 設計更清晰、不可變、執行緒安全。

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

public class ModernDateTimeDemo {
    public static void main(String[] args) {
        // 當前時間
        LocalDateTime now = LocalDateTime.now();
        System.out.println("當前:" + now);

        // 解析字串
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime custom = LocalDateTime.parse("2013-11-10 18:45:39", formatter);
        System.out.println("指定:" + custom);

        // 取得各欄位
        System.out.printf("年:%d 月:%d 日:%d 時:%d 分:%d 秒:%d%n",
                custom.getYear(), custom.getMonthValue(), custom.getDayOfMonth(),
                custom.getHour(), custom.getMinute(), custom.getSecond());

        // 格式化輸出
        String formatted = custom.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒"));
        System.out.println("格式化:" + formatted);
    }
}

優勢比較

特性Calendar / Datejava.time
不可變性可變不可變(執行緒安全)
API 設計繁瑣、易混淆流暢、語意清晰
時區處理隱含、易出錯顯式 ZonedDateTime
解析/格式化SimpleDateFormat(非安全)DateTimeFormatter(安全)

總結

維護舊專案時仍會遇到 Calendar 與 SimpleDateFormat,掌握其用法與坑點很重要。新專案或重構時,請優先採用 java.time 套件,能大幅減少日期時間處理的 Bug。

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