目录

  1. Java 日期时间概述
  2. Java 8 及以上的日期时间 API(java.time
  3. Java 8 之前的日期时间 API(java.util.Datejava.util.Calendar
  4. 日期格式化与解析(DateTimeFormatterSimpleDateFormat
  5. 时间戳(InstantSystem.currentTimeMillis()
  6. 时区处理(ZoneIdZonedDateTime
  7. 示例代码
  8. 参考资料
  9. 出站链接

1. Java 日期时间概述

Java 主要有两套日期时间 API:

  1. Java 8 及以上(推荐使用):java.time 包提供现代化、线程安全的日期时间 API,如 LocalDateLocalTimeLocalDateTimeZonedDateTime 等。
  2. Java 8 之前(已过时但仍可用):java.util.Datejava.util.Calendar,它们有许多缺陷,如不可变性差、易出错、线程不安全。

2. Java 8 及以上的日期时间 API(java.time

Java 8 引入了 java.time 包,该 API 受 Joda-Time 库启发,提供更清晰、更易用的日期时间处理方式。

LocalDate(表示日期)

表示日期(年、月、日),不包含时间和时区信息:

import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("今天的日期: " + today);
        
        LocalDate specificDate = LocalDate.of(2025, 3, 23);
        System.out.println("指定日期: " + specificDate);
    }
}

LocalTime(表示时间)

表示一天中的时间(时、分、秒、纳秒),不包含日期和时区:

import java.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        LocalTime now = LocalTime.now();
        System.out.println("当前时间: " + now);

        LocalTime specificTime = LocalTime.of(14, 30, 0);
        System.out.println("指定时间: " + specificTime);
    }
}

LocalDateTime(表示日期时间)

同时包含日期和时间:

import java.time.LocalDateTime;

public class Main {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println("当前日期时间: " + now);

        LocalDateTime specificDateTime = LocalDateTime.of(2025, 3, 23, 14, 30, 0);
        System.out.println("指定日期时间: " + specificDateTime);
    }
}

ZonedDateTime(带时区的日期时间)

用于表示带时区的日期时间:

import java.time.ZonedDateTime;
import java.time.ZoneId;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime nowInUTC = ZonedDateTime.now(ZoneId.of("UTC"));
        System.out.println("当前 UTC 时间: " + nowInUTC);

        ZonedDateTime nowInShanghai = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        System.out.println("当前上海时间: " + nowInShanghai);
    }
}

DurationPeriod

  • Duration:用于计算两个时间点之间的间隔(秒、纳秒级)。
  • Period:用于计算两个日期之间的间隔(天、月、年)。

示例:

import java.time.Duration;
import java.time.LocalTime;
import java.time.Period;
import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        LocalTime start = LocalTime.of(14, 0);
        LocalTime end = LocalTime.of(16, 30);
        Duration duration = Duration.between(start, end);
        System.out.println("时间间隔: " + duration.toHours() + " 小时");

        LocalDate startDate = LocalDate.of(2024, 3, 1);
        LocalDate endDate = LocalDate.of(2025, 3, 1);
        Period period = Period.between(startDate, endDate);
        System.out.println("日期间隔: " + period.getYears() + " 年");
    }
}


3. Java 8 之前的日期时间 API(java.util.Datejava.util.Calendar

使用 Date(已过时)

import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println("当前日期: " + date);
    }
}

使用 Calendar

import java.util.Calendar;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        System.out.println("当前日期: " + calendar.getTime());
    }
}


4. 日期格式化与解析(DateTimeFormatterSimpleDateFormat

DateTimeFormatter(Java 8 及以上)

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

public class Main {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("格式化日期时间: " + now.format(formatter));
    }
}

SimpleDateFormat(Java 8 之前)

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

public class Main {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("格式化日期时间: " + sdf.format(new Date()));
    }
}


5. 时间戳(InstantSystem.currentTimeMillis()

import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        Instant timestamp = Instant.now();
        System.out.println("当前时间戳: " + timestamp);
    }
}


6. 时区处理(ZoneIdZonedDateTime

import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
        System.out.println("东京时间: " + now);
    }
}


参考资料


出站链接