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

Java 獲取當前時間完整指南:Date/Calendar/SimpleDateFormat/Instant 最佳實踐

     編輯:Java 相關知識

Java 時間處理經歷了三代 API 演進:Date/Calendar(1.0/1.1,缺陷多)、SimpleDateFormat(格式化)、java.time(Java 8+,不可變、線程安全、領域清晰)。本文提供各版本最佳實踐代碼模板與避坑指南。

一、Java 8+ java.time 包(推薦標準)

import java.time.*;
import java.time.format.DateTimeFormatter;

// 1. 當前瞬間(UTC)
Instant nowInstant = Instant.now();  // 2024-01-15T06:30:00.123Z

// 2. 當前本地日期時間(無時區)
LocalDateTime nowLocal = LocalDateTime.now(); // 2024-01-15T14:30:00.123

// 3. 當前時區日期時間(推薦業務使用)
ZonedDateTime nowZoned = ZonedDateTime.now(); // 2024-01-15T14:30:00.123+08:00[Asia/Shanghai]

// 4. 格式化輸出
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = nowZoned.format(fmt); // "2024-01-15 14:30:00"

// 5. 解析字符串
LocalDateTime parsed = LocalDateTime.parse("2024-01-15 14:30:00", fmt);

// 6. 日期運算
LocalDateTime tomorrow = nowLocal.plusDays(1);
LocalDateTime lastMonth = nowLocal.minusMonths(1);
Period period = Period.between(LocalDate.now(), LocalDate.of(2025, 1, 1));

// 7. 時區轉換
ZonedDateTime nyTime = nowZoned.withZoneSameInstant(ZoneId.of("America/New_York"));

// 8. 時間戳互轉
long epochMilli = nowInstant.toEpochMilli();
Instant fromMilli = Instant.ofEpochMilli(epochMilli);

核心類速查

類含義是否含時區適用場景
Instant時間線上的瞬間UTC日誌時間戳、跨系統傳輸、持久化
LocalDateTime本地日期時間無業務邏輯計算、表單綁定
ZonedDateTime帶時區日期時間有用戶顯示、定時任務、國際化
LocalDate本地日期無生日、證件到期、報表日期
LocalTime本地時間無鬧鐘、營業時間

二、Java 7 及之前:Date/Calendar/SimpleDateFormat(維護舊代碼用)

1. 獲取當前時間並格式化

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

Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(now); // "2024-01-15 14:30:00"
System.out.println("Today is " + str);

2. Calendar 日期運算

import java.util.Calendar;

Calendar cal = Calendar.getInstance(); // 當前時間
cal.add(Calendar.DAY_OF_MONTH, 1);     // 明天
cal.add(Calendar.MONTH, -1);           // 上個月
cal.set(Calendar.HOUR_OF_DAY, 0);      // 設置為當天 00:00:00
Date date = cal.getTime();             // 轉回 Date

3. 線程安全陷阱

  • SimpleDateFormat 非線程安全,多線程共用實例會導致解析錯誤/數據竄改。
  • 正確做法:
    1. 方法局部變量創建(推薦):new SimpleDateFormat(...) 每次新建。
    2. ThreadLocal<SimpleDateFormat> 緩存複用。
    3. Apache Commons Lang FastDateFormat(線程安全)。

三、JSP/JavaScript 前端獲取時間

JSP 中使用 Java 代碼

<%@ page import="java.time.*, java.time.format.*" %>
<%
    ZonedDateTime now = ZonedDateTime.now();
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
%>
當前時間:<%= now.format(fmt) %>

JavaScript 獲取客戶端時間

function printDate() {
    var today = new Date();
    var day = String(today.getDate()).padStart(2, '0');
    var month = String(today.getMonth() + 1).padStart(2, '0'); // 月份 0-11
    var year = today.getFullYear();
    document.getElementById('intoDate').value = year + '-' + month + '-' + day;
}

// 頁面加載自動調用
window.onload = printDate;

四、常見格式模式對照表

符號含義示例
yyyy年(4位)2024
MM月(01-12)01
dd日(01-31)15
HH時(00-23,24制)14
mm分(00-59)30
ss秒(00-59)00
SSS毫秒(000-999)123
zzz時區偏移+0800

五、最佳實踐總結

  1. 新項目強制使用 java.time:不可變、線程安全、API 清晰(plusDays vs add)。
  2. 持久化存儲 Instant/UTC:數據庫 TIMESTAMP WITH TIME ZONE 或 BIGINT 存毫秒數。
  3. 業務邏輯用 LocalDateTime:無時區干擾,計算準確。
  4. 用戶顯示用 ZonedDateTime:自動適配用戶時區。
  5. 避免在實體類用 java.util.Date:改用 LocalDateTime + JPA @Convert 或 Hibernate 內置 JavaTime 類型。
  6. 定時任務 Cron 表達式基於系統默認時區,跨時區部署需顯式指定 ZoneId。

時間處理是業務系統的「隱形基礎設施」,選對 API、統一時區、正確格式化,能消除 99% 的時間相關 Bug。Java 8 java.time 是 JSR-310 專家組(含 Joda-Time 作者 Stephen Colebourne)精心設計的現代標準,請毫不猶豫地全面遷移。

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