java8 的时间、日期处理类

Java 8引入了java.time包,该包提供了一组全新的时间和日期处理类,以解决旧的java.util.Datejava.util.Calendar类的问题。以下是java.time包中的一些主要类:

java8 的时间、日期处理类_第1张图片

java8 的时间、日期处理类_第2张图片

1 jdk8之前的时间形式

在 Java 8 之前,我们处理日期时间需求时,使用 DateCalender 
SimpleDateFormat,来声明时间戳、使用日历处理日期和格式化解析日期时间。但是,这
些类的 API 的缺点比较明显,比如可读性差、易用性差、使用起来冗余繁琐,还有线程安
全问题

结构定义混乱
java.util Date包含日期时间
java.sql Date包含日期
java.text 时间格式化
API不易用
非线程安全
可变,SimpleDateFormate
国际化
Date如果不格式化,打印出的日期可读性差
Calendar TimeZone
 

Calendar与Date

public class DateTest {

    public static void main(String[] args) {
        wrong();
        right();
        better();
    }

    private static void wrong() {
        System.out.println("wrong");
        Date date = new Date(2019, 12, 31, 11, 12, 13);
        System.out.println(date);
    }

    private static void wrongfix() {
        System.out.println("right");
        Date date = new Date(2019 - 1900, 11, 31, 11, 12, 13);
        System.out.println(date);
    }

    private static void right() {
        System.out.println("right");
        Calendar calendar = Calendar.getInstance();
        calendar.set(2019, 11, 31, 11, 12, 13);
        System.out.println(calendar.getTime());
        Calendar calendar2 = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
        calendar2.set(2019, Calendar.DECEMBER, 31, 11, 12, 13);
        System.out.println(calendar2.getTime());

    }

    private static void better() {
        System.out.println("better");
        LocalDateTime localDateTime = LocalDateTime.of(2019, Month.DECEMBER, 31, 11, 12, 13);
        System.out.println(localDateTime);
        ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("America/New_York"));
        System.out.println(zonedDateTime);
    }
}

LocalDate

表示一个不带时区的日期。可以表示如年、月、日等日期信息。LocalDate类内只包含日期,不包含具体时间

// 获取当前日期
LocalDate currentDate = LocalDate.now();
System.out.println("Current Date: " + currentDate);

// 创建指定日期
LocalDate customDate = LocalDate.of(2022, 5, 20);
System.out.println("Custom Date: " + customDate);
// 只获取日期
LocalDate today = LocalDate.now();
System.out.println(today);

int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();

System.out.printf("Year : %d Month : %d day : %d \t %n", year, month, day);

LocalTime

表示一个不带时区的时间。可以表示如小时、分钟、秒等时间信息。

// 获取当前时间
LocalTime currentTime = LocalTime.now();
System.out.println("Current Time: " + currentTime);

// 创建指定时间
LocalTime customTime = LocalTime.of(15, 30, 45);
System.out.println("Custom Time: " + customTime);

LocalDateTime

表示一个不带时区的日期时间。

// 获取当前日期和时间
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("Current Date and Time: " + currentDateTime);

// 创建指定日期和时间
LocalDateTime customDateTime = LocalDateTime.of(2022, 8, 10, 12, 30);
System.out.println("Custom Date and Time: " + customDateTime);

ZonedDateTime

表示一个带时区的日期时间。

// 获取当前日期和时间以及时区
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("Current Date and Time with Zone: " + zonedDateTime);

// 创建指定日期和时间以及时区
ZoneId newYorkZone = ZoneId.of("America/New_York");
ZonedDateTime customZonedDateTime = ZonedDateTime.of(2022, 6, 25, 10, 0, 0, 0, newYorkZone);
System.out.println("Custom Date and Time with Zone: " + customZonedDateTime);

Period

表示两个日期之间的时间段。

// 计算日期之间的时间段
LocalDate startDate = LocalDate.of(2022, 1, 1);
LocalDate endDate = LocalDate.now();
Period period = Period.between(startDate, endDate);
System.out.println("Period between " + startDate + " and " + endDate + ": " + period.getYears() + " years, " + period.getMonths() + " months, " + period.getDays() + " days");

Duration

表示两个时间之间的时间段。

// 计算时间之间的时间段
LocalTime startTime = LocalTime.of(10, 0);
LocalTime endTime = LocalTime.now();
Duration duration = Duration.between(startTime, endTime);
System.out.println("Duration between " + startTime + " and " + endTime + ": " + duration.toHours() + " hours, " + duration.toMinutes() + " minutes, " + duration.getSeconds() + " seconds");

Instant

表示时间线上的一个点,通常用于机器时间。

// 获取当前时间戳
Instant instant = Instant.now();
System.out.println("Current Timestamp: " + instant);

// 使用时间戳创建Instant对象
Instant specificInstant = Instant.ofEpochMilli(System.currentTimeMillis());
System.out.println("Specific Timestamp: " + specificInstant);

DateTimeFormatter

用于格式化和解析日期和时间的类。

// 使用DateTimeFormatter格式化日期和时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime currentDateTime = LocalDateTime.now();
String formattedDateTime = currentDateTime.format(formatter);
System.out.println("Formatted Date and Time: " + formattedDateTime);

// 使用DateTimeFormatter解析字符串为日期和时间
String dateString = "2023-03-15 14:30:00";
LocalDateTime parsedDateTime = LocalDateTime.parse(dateString, formatter);
System.out.println("Parsed Date and Time: " + parsedDateTime);

10 ZonedDateTime

  • ZonedDateTime 是不可变的类,表示带时区的日期和时间。
  • 通过将 LocalDateTimeZoneId(时区标识)组合而成,使得可以在不同的时区中表示相同的瞬时时间。
  • 提供了对时区信息的完整支持,可以处理夏令时(Daylight Saving Time)等时区相关的变化。
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class ZonedDateTimeExample {
    public static void main(String[] args) {
        // 创建一个本地日期时间对象
        LocalDateTime localDateTime = LocalDateTime.of(2022, 3, 15, 12, 0);

        // 为本地日期时间对象添加时区信息
        ZoneId newYorkZone = ZoneId.of("America/Shanghai");
        ZonedDateTime newYorkDateTime = ZonedDateTime.of(localDateTime, newYorkZone);

        // 输出不同时区下的日期时间
        System.out.println("Local Date and Time: " + localDateTime);
        System.out.println("New York Date and Time: " + newYorkDateTime);

        // 获取当前时区下的日期时间
        ZonedDateTime currentDateTime = ZonedDateTime.now();
        System.out.println("Current Date and Time: " + currentDateTime);
    }
}
  • 创建了一个本地日期时间对象 localDateTime,表示2022年3月15日12:00。
  • 使用 ZoneId 创建了一个代表上海时区的 newYorkZone
  • localDateTimenewYorkZone 结合,创建了 newYorkDateTime 对象,表示纽约时区下的日期时间。
  • 输出了本地和纽约时区下的日期时间。
  • 最后,通过 ZonedDateTime.now() 获取当前时区下的日期时间并输出。

这样,ZonedDateTime 允许我们在处理日期和时间时,考虑到全球不同的时区。

时间的转换

Date —->LocalDate

要将java.util.Date转换为java.time.LocalDate,您可以使用Instant类来先从Date获取时间戳,然后使用该时间戳创建LocalDate。以下是一个例子:

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;

public class DateToLocalDateExample {
    public static void main(String[] args) {
        // 创建一个java.util.Date对象
        Date date = new Date();

        // 将Date转换为Instant
        Instant instant = date.toInstant();

        // 使用Instant创建LocalDate,需要指定时区
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDate localDate = instant.atZone(zoneId).toLocalDate();

        System.out.println("Original Date: " + date);
        System.out.println("Converted LocalDate: " + localDate);
    }
}

在这个例子中,我们首先使用toInstant()方法将Date对象转换为Instant对象,然后使用atZone()方法将Instant转换为ZonedDateTime,最后使用toLocalDate()方法获取LocalDate。请注意,toLocalDate()方法需要指定时区,我们使用了系统默认的时区。

LocalDate—>Date

要将java.time.LocalDate转换为java.util.Date,可以使用atStartOfDay()方法将LocalDate转换为LocalDateTime,然后再通过Date.from()LocalDateTime转换为Date

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;

public class LocalDateToDateExample {
    public static void main(String[] args) {
        // 创建一个java.time.LocalDate对象
        LocalDate localDate = LocalDate.now();

        // 将LocalDate转换为LocalDateTime(在当天的开始时间)
        LocalDateTime localDateTime = localDate.atStartOfDay();

        // 将LocalDateTime转换为Date
        Date date = Date.from(localDateTime.toInstant());

        System.out.println("Original LocalDate: " + localDate);
        System.out.println("Converted Date: " + date);
    }
}

在这个例子中,我们首先使用atStartOfDay()LocalDate转换为LocalDateTime,然后通过toInstant()LocalDateTime转换为Instant,最后使用Date.from()方法将Instant转换为Date。这样就完成了LocalDateDate的转换。

借鉴引用 https://blog.csdn.net/lemon_TT/article/details/109145432

你可能感兴趣的:(python,开发语言)