Java 8引入了java.time
包,该包提供了一组全新的时间和日期处理类,以解决旧的java.util.Date
和java.util.Calendar
类的问题。以下是java.time
包中的一些主要类:
在 Java 8 之前,我们处理日期时间需求时,使用
Date
、Calender
和SimpleDateFormat
,来声明时间戳、使用日历处理日期和格式化解析日期时间。但是,这
些类的 API 的缺点比较明显,比如可读性差、易用性差、使用起来冗余繁琐,还有线程安
全问题
结构定义混乱
java.util Date包含日期时间
java.sql Date包含日期
java.text 时间格式化
API不易用
非线程安全
可变,SimpleDateFormate
国际化
Date如果不格式化,打印出的日期可读性差
Calendar TimeZone
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 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 currentTime = LocalTime.now();
System.out.println("Current Time: " + currentTime);
// 创建指定时间
LocalTime customTime = LocalTime.of(15, 30, 45);
System.out.println("Custom Time: " + customTime);
表示一个不带时区的日期时间。
// 获取当前日期和时间
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.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);
表示两个日期之间的时间段。
// 计算日期之间的时间段
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");
表示两个时间之间的时间段。
// 计算时间之间的时间段
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.now();
System.out.println("Current Timestamp: " + instant);
// 使用时间戳创建Instant对象
Instant specificInstant = Instant.ofEpochMilli(System.currentTimeMillis());
System.out.println("Specific Timestamp: " + specificInstant);
用于格式化和解析日期和时间的类。
// 使用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);
ZonedDateTime
是不可变的类,表示带时区的日期和时间。- 通过将
LocalDateTime
和ZoneId
(时区标识)组合而成,使得可以在不同的时区中表示相同的瞬时时间。- 提供了对时区信息的完整支持,可以处理夏令时(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
。- 将
localDateTime
与newYorkZone
结合,创建了newYorkDateTime
对象,表示纽约时区下的日期时间。- 输出了本地和纽约时区下的日期时间。
- 最后,通过
ZonedDateTime.now()
获取当前时区下的日期时间并输出。这样,
ZonedDateTime
允许我们在处理日期和时间时,考虑到全球不同的时区。
要将
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()
方法需要指定时区,我们使用了系统默认的时区。
要将
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
。这样就完成了LocalDate
到Date
的转换。
借鉴引用 https://blog.csdn.net/lemon_TT/article/details/109145432