杰瑞科技汇

Java如何精确获取年月日时分秒?

使用 java.util.Datejava.text.SimpleDateFormat (传统方式)

这是 Java 早期版本中非常经典的方式,但现在已经不推荐在新代码中使用,因为 Date 类本身设计上存在一些问题,并且不是线程安全的。

Java如何精确获取年月日时分秒?-图1
(图片来源网络,侵删)

特点:

  • java.util.Date: 表示一个特定的瞬间,精确到毫秒。
  • java.text.SimpleDateFormat: 用于将 Date 对象格式化为我们想要的字符串,或者将字符串解析为 Date 对象。

代码示例:

import java.text.SimpleDateFormat;
import java.util.Date;
public class DateExample {
    public static void main(String[] args) {
        // 1. 获取当前时间的 Date 对象
        Date now = new Date();
        // 2. 创建一个 SimpleDateFormat 对象,并指定格式
        // yyyy: 年
        // MM: 月 (注意是大写,区分于 mm: 分钟)
        // dd: 日
        // HH: 时 (24小时制)
        // mm: 分
        // ss: 秒
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 3. 格式化 Date 对象为字符串
        String formattedDate = sdf.format(now);
        System.out.println("当前时间 (SimpleDateFormat): " + formattedDate);
        // 如果需要分别获取年、月、日等字段
        // 可以使用 Calendar 类,但更推荐使用 Java 8 的新 API
        // ...
    }
}

输出示例:

当前时间 (SimpleDateFormat): 2025-10-27 15:30:55

使用 java.util.Calendar (稍作改进的方式)

Calendar 类提供了比 Date 更丰富的功能,可以方便地获取和操作日期/时间的各个字段(年、月、日等)。

Java如何精确获取年月日时分秒?-图2
(图片来源网络,侵删)

特点:

  • java.util.Calendar: 是一个抽象类,它提供了将 Date 对象转换为一组日历字段(如 YEAR, MONTH, DAY_OF_MONTH 等)的方法。
  • 月份是从 0 开始的(0 代表一月),这一点需要特别注意。

代码示例:

import java.util.Calendar;
public class CalendarExample {
    public static void main(String[] args) {
        // 1. 获取一个 Calendar 实例(默认使用当前时间和默认时区)
        Calendar calendar = Calendar.getInstance();
        // 2. 获取各个字段
        // 注意:月份是从 0 开始的,所以需要 +1
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1; // 月份需要 +1
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY); // 24小时制
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        // 3. 打印结果
        System.out.println("当前时间 (Calendar):");
        System.out.println("年: " + year);
        System.out.println("月: " + month);
        System.out.println("日: " + day);
        System.out.println("时: " + hour);
        System.out.println("分: " + minute);
        System.out.println("秒: " + second);
        // 也可以组合成字符串
        String formattedString = String.format("%04d-%02d-%02d %02d:%02d:%02d",
                year, month, day, hour, minute, second);
        System.out.println("格式化字符串: " + formattedString);
    }
}

输出示例:

当前时间 (Calendar):
年: 2025
月: 10
日: 27
时: 15
分: 31
秒: 5
格式化字符串: 2025-10-27 15:31:05

使用 Java 8+ 的 java.time API (强烈推荐)

自 Java 8 引入了全新的 java.time 包,这是目前处理日期和时间的最佳实践,它设计更优秀、更易用、更安全(不可变且线程安全)。

java.time 包中包含多个核心类,用于不同的场景:

  1. LocalDateTime: 表示不带时区的日期和时间(最常用)。
  2. ZonedDateTime: 表示带有时区的日期和时间。
  3. LocalDate: 只表示日期。
  4. LocalTime: 只表示时间。

使用 LocalDateTime 获取年月日时分秒:

这是最直接、最推荐的方式。

代码示例:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Java8TimeExample {
    public static void main(String[] args) {
        // 1. 获取当前日期和时间 (不带时区)
        LocalDateTime now = LocalDateTime.now();
        // 2. 分别获取各个字段
        int year = now.getYear();
        int month = now.getMonthValue(); // getMonthValue() 返回 1-12,无需 +1
        int day = now.getDayOfMonth();
        int hour = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();
        System.out.println("当前时间 (LocalDateTime):");
        System.out.println("年: " + year);
        System.out.println("月: " + month);
        System.out.println("日: " + day);
        System.out.println("时: " + hour);
        System.out.println("分: " + minute);
        System.out.println("秒: " + second);
        // 3. 使用 DateTimeFormatter 格式化输出
        // 这种方式比 SimpleDateFormat 更简洁、更安全
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedDateTime = now.format(formatter);
        System.out.println("\n格式化字符串: " + formattedDateTime);
    }
}

输出示例:

当前时间 (LocalDateTime):
年: 2025
月: 10
日: 27
时: 15
分: 32
秒: 10
格式化字符串: 2025-10-27 15:32:10

总结与对比

特性 java.util.Date java.util.Calendar java.time (Java 8+)
推荐度 不推荐 不推荐 强烈推荐
线程安全 (所有核心类都是不可变的)
易用性 一般 (需配合 SimpleDateFormat) 较好 非常好 (API 设计清晰)
月份表示 无直接方法,需用 Calendar 0 开始 (0代表一月) 1 开始 (符合直觉)
现代功能 支持,如时区、Duration、Period 等
核心类 Date, SimpleDateFormat Calendar LocalDateTime, ZonedDateTime, DateTimeFormatter
  • 对于新项目:请毫不犹豫地使用 Java 8+ 的 java.time API,它是现代 Java 开发的标准,代码更简洁、更健壮。
  • 对于维护旧项目:你可能会遇到 DateCalendar,了解它们的工作原理是必要的,但在新代码中应尽量避免使用。
  • 注意:如果你需要处理数据库,JDBC 4.2+ 也已经完全支持 java.time 类型,可以直接与数据库交互。
分享:
扫描分享到社交APP
上一篇
下一篇