java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java日期类

Java日期类详解(最新推荐)

作者:chxii

早期版本主要使用 java.util.Date、java.util.Calendar 等类,Java 8及以后引入了新的日期和时间API(JSR 310),包含在java.time包中,本文给大家介绍Java日期类的相关知识,感兴趣的朋友一起看看吧

在 Java 中,处理日期和时间的类随着版本的发展有不同的体系。早期版本主要使用 java.util.Datejava.util.Calendar 等类,Java 8 及以后引入了新的日期和时间 API(JSR 310),包含在 java.time 包中。

甲骨文官方文档

Overview (Java SE 21 & JDK 21)

JDK中文文档。https://java.cunzaima.cn/jdk21/doc-zh/api/index.html

旧的日期时间API

1. java.util.Date

import java.util.Date;
public class DateExample {
    public static void main(String[] args) {
        // 创建表示当前时间的 Date 对象
        Date currentDate = new Date();
        System.out.println("当前时间: " + currentDate);
        // 根据毫秒数创建 Date 对象
        long milliseconds = 1609459200000L;
        Date specificDate = new Date(milliseconds);
        System.out.println("指定时间: " + specificDate);
        // 获取毫秒数
        long timeInMillis = currentDate.getTime();
        System.out.println("当前时间的毫秒数: " + timeInMillis);
        // 比较两个 Date 对象
        boolean isEqual = currentDate.equals(specificDate);
        System.out.println("两个日期是否相等: " + isEqual);
    }
}

2. java.util.Calendar

import java.util.Calendar;
public class CalendarExample {
    public static void main(String[] args) {
        // 获取 Calendar 实例
        Calendar calendar = Calendar.getInstance();
        // 获取年、月、日
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1; // 月份从 0 开始,所以要加 1
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println("当前日期: " + year + "-" + month + "-" + day);
        // 设置日期
        calendar.set(Calendar.YEAR, 2025);
        calendar.set(Calendar.MONTH, Calendar.JUNE);
        calendar.set(Calendar.DAY_OF_MONTH, 15);
        System.out.println("设置后的日期: " + calendar.getTime());
        // 日期加减操作
        calendar.add(Calendar.DAY_OF_MONTH, 5);
        System.out.println("加 5 天后的日期: " + calendar.getTime() +"\t"
+  calendar.getTime().getTime()+"\t"+  calendar.getTimeInMillis()  +"\t"
+  calendar.getTimeZone().getOffset(calendar.getTimeInMillis()));
        // 设置时区
        TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
        calendar.setTimeZone(timeZone);
        System.out.println("美国纽约的日期: " + calendar.getTime() +"\t"
+  calendar.getTime().getTime()  +"\t"+ calendar.getTimeInMillis() +"\t"
+  calendar.getTimeZone().getOffset(calendar.getTimeInMillis()));
    }
}

SimpleDateFormat:用于将Date对象格式化为指定的字符串格式,或者将字符串解析为Date对象。它通过模式字符串来定义日期和时间的格式,常用的模式字符有:

例如,SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");可以将Date对象格式化为2024-05-08 14:34:56这样的字符串。

java.util.CalendarCalendar类主要用于对日期和时间进行操作和计算,它本身没有直接的日期格式表示。但可以通过SimpleDateFormatCalendar对象转换为指定格式的字符串,例如:

        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdf.format(calendar.getTime());
        String dateString = "2024-10-01 14:30:00";
        try {
            Date date = sdf.parse(dateString);
            System.out.println("解析后的日期: " + date);
        } catch (ParseException e) {
            System.out.println("解析日期时出错: " + e.getMessage());
        }

新的日期时间 API(Java 8+)

1. java.time.LocalDate

import java.time.LocalDate;
public class LocalDateExample {
    public static void main(String[] args) {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        System.out.println("当前日期: " + currentDate);
        // 根据指定的年、月、日创建 LocalDate 对象
        LocalDate specificDate = LocalDate.of(2025, 6, 15);
        System.out.println("指定日期: " + specificDate);
        // 获取日期信息
        int year = specificDate.getYear();
        int month = specificDate.getMonthValue();
        int day = specificDate.getDayOfMonth();
        System.out.println("指定日期的年: " + year + ", 月: " + month + ", 日: " + day);
        // 日期加减操作
        LocalDate newDate = specificDate.plusDays(5);
        System.out.println("加 5 天后的日期: " + newDate);
    }
}

2. java.time.LocalTime

import java.time.LocalTime;
public class LocalTimeExample {
    public static void main(String[] args) {
        // 获取当前时间
        LocalTime currentTime = LocalTime.now();
        System.out.println("当前时间: " + currentTime);
        // 根据指定的时、分创建 LocalTime 对象
        LocalTime specificTime = LocalTime.of(14, 30);
        System.out.println("指定时间: " + specificTime);
        // 获取时间信息
        int hour = specificTime.getHour();
        int minute = specificTime.getMinute();
        System.out.println("指定时间的时: " + hour + ", 分: " + minute);
        // 时间加减操作
        LocalTime newTime = specificTime.plusHours(2);
        System.out.println("加 2 小时后的时间: " + newTime);
    }
}

3. java.time.LocalDateTime

import java.time.LocalDateTime;
public class LocalDateTimeExample {
    public static void main(String[] args) {
        // 获取当前日期和时间
        LocalDateTime currentDateTime = LocalDateTime.now();
        System.out.println("当前日期和时间: " + currentDateTime);
        // 根据指定的日期和时间创建 LocalDateTime 对象
        LocalDateTime specificDateTime = LocalDateTime.of(2025, 6, 15, 14, 30);
        System.out.println("指定日期和时间: " + specificDateTime);
        // 日期和时间加减操作
        LocalDateTime newDateTime = specificDateTime.plusDays(2).plusHours(3);
        System.out.println("加 2 天 3 小时后的日期和时间: " + newDateTime);
    }
}

4. java.time.ZonedDateTime

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class ZonedDateTimeExample {
    public static void main(String[] args) {
        // 获取当前带时区的日期和时间
        ZonedDateTime currentZonedDateTime = ZonedDateTime.now();
        System.out.println("当前带时区的日期和时间: " + currentZonedDateTime);
        // 根据 LocalDateTime 和 ZoneId 创建 ZonedDateTime 对象
        LocalDateTime localDateTime = LocalDateTime.of(2025, 6, 15, 14, 30);
        ZoneId zoneId = ZoneId.of("Asia/Shanghai");
        ZonedDateTime specificZonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
        System.out.println("指定带时区的日期和时间: " + specificZonedDateTime);
        // 获取时区信息
        ZoneId zone = specificZonedDateTime.getZone();
        System.out.println("时区: " + zone);
    }
}

Instant对象

获取时间戳

时间计算

与其他日期时间类型的转换

DateTimeFormatter

LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"))
//会将当前日期格式化为08/05/2024。

综合案例:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterExample {
    public static void main(String[] args) {
        // 1. 通过模式字符串创建DateTimeFormatter
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 2. 格式化当前日期时间
        LocalDateTime now = LocalDateTime.now();
        String formattedDateTime1 = formatter1.format(now);
        System.out.println("Formatted DateTime 1: " + formattedDateTime1);
        // 3. 使用预定义的格式创建DateTimeFormatter
        DateTimeFormatter formatter2 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        String formattedDateTime2 = formatter2.format(now);
        System.out.println("Formatted DateTime 2: " + formattedDateTime2);
        // 4. 解析字符串为日期时间对象
        String dateTimeStr = "2024-05-08 12:30:00";
        LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeStr, formatter1);
        System.out.println("Parsed DateTime: " + parsedDateTime);
        // 5. 基于本地化创建DateTimeFormatter
        DateTimeFormatter formatter3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
               .withLocale(Locale.CHINA);
        String formattedDateTime3 = formatter3.format(now);
        System.out.println("Formatted DateTime 3: " + formattedDateTime3);
    }
}

Duration

Duration 类用于以秒和纳秒的方式表示时间间隔,它主要处理基于时间(小时、分钟、秒、纳秒)的时间量,适用于处理诸如程序执行时间、两个时间点之间的时间差等场景。

创建 Duration 对象

import java.time.Duration;
import java.time.LocalTime;
public class DurationExample {
    public static void main(String[] args) {
        LocalTime startTime = LocalTime.of(9, 0);
        LocalTime endTime = LocalTime.of(12, 30);
        Duration duration = Duration.between(startTime, endTime);
        System.out.println("时间间隔: " + duration);
    }
}
Duration duration = Duration.of(2, java.time.temporal.ChronoUnit.HOURS);
System.out.println("自定义时间间隔: " + duration);

获取 Duration 中的值

可以使用 getSeconds() 方法获取 Duration 中的总秒数,使用 toHours()toMinutes() 等方法将其转换为不同的时间单位

Duration duration = Duration.of(2, java.time.temporal.ChronoUnit.HOURS);
System.out.println("总秒数: " + duration.getSeconds());
System.out.println("总小时数: " + duration.toHours());

对 Duration 进行操作

Duration duration1 = Duration.of(1, java.time.temporal.ChronoUnit.HOURS);
Duration duration2 = Duration.of(2, java.time.temporal.ChronoUnit.HOURS);
Duration sumDuration = duration1.plus(duration2);
Duration diffDuration = duration1.minus(duration2);
System.out.println("相加后的间隔: " + sumDuration);
System.out.println("相减后的间隔: " + diffDuration);

Period

Period 类用于以年、月、日的方式表示日期之间的间隔,它主要处理基于日期(年、月、日)的时间量,适用于处理诸如人的年龄、两个事件之间的日期差等场景。

创建 Period 对象

Period.between(LocalDate startDate, LocalDate endDate):根据两个 LocalDate 对象计算它们之间的日期间隔。

import java.time.LocalDate;
import java.time.Period;
public class PeriodExample {
    public static void main(String[] args) {
        LocalDate startDate = LocalDate.of(2020, 1, 1);
        LocalDate endDate = LocalDate.of(2023, 12, 31);
        Period period = Period.between(startDate, endDate);
        System.out.println("日期间隔: " + period);
    }
}

Period.of(int years, int months, int days):通过指定年、月、日的值来创建 Period 对象。

Period period = Period.of(2, 3, 10);
System.out.println("自定义日期间隔: " + period);

获取 Period 中的值

可以使用 getYears()getMonths() 和 getDays() 方法分别获取 Period 中的年、月、日部分

Period period = Period.of(2, 3, 10);
System.out.println("年: " + period.getYears());
System.out.println("月: " + period.getMonths());
System.out.println("日: " + period.getDays());

对 Period 进行操作

总结

新旧日期时间 API 对比

到此这篇关于Java日期类的文章就介绍到这了,更多相关java日期类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文