Java 8 新日期时间 API ( 上 ) – 本地日期时间
引言
作为开发者,经常需要处理日期时间。如果你跟随者 Java 5 一路走来,那么一定会对 java.util.Date 、java.util.Calendar 、java.util.GregoiranCalendar 和 java.text.SimpleDateFormat 四大类非常熟悉,它们分别用于处理日期、日历、日历表示、日期时间格式化。
这四个类,对于编程老人来讲,应该是习惯了,但对于编程新人来讲,就有好多疑问,有好多陷阱和坑等着它们跳,比如
1、 非线程安全:java.util.Date 并不是线程安全的。开发者在使用这个类时必须自己处理多线程并发问题。 2、 设计不佳 :一方面日期和日期格式化分布在多个包中。另一方面,java.util.Date 的默认日期,年竟然是从 1900 开始,月从 1 开始,日从 0 开始,没有统一性。而且 Date 类也缺少直接操作日期的相关方法。 3、 时区处理困难:因为设计不佳,开发人员不得不编写大量代码来处理时区问题。 4、 还有其它一些问题
面对种种问题,Java 8 终于重新设计了所有日期时间、日历及时区相关的 API 。并把它们都统一放置在 java.time 包和子包下。并作出了以下改进
1、 新的日期时间 API 是线程安全的。不仅没有 setter 方法,而且任何对实例的变更都会返回一个新的实例而保证原来的实例不变。 2、 新的日期时间 API 提供了大量的方法,用于修改日期时间的各个部分,并返回一个新的实例。 3、 在时区方面,新的日期时间 API 引入了 域 ( domain ) 这个概念。
同时 Java 8 还针对原来复杂的 API 进行重新组合和拆分,分成了好多个类。本章接下来的章节,我们就来详细介绍其中几个最重要的。
本地日期时间 API
Java 8 为处理本地的日期时间提供了三个类 LocalDate 、LocalTime 和 LocalDateTime 。分别用于处理 本地日期、本地时间 和 本地日期时间。
当使用这三个类时,开发者并不需要关心时区是什么。因为它默认使用的是操作系统的时区。
import org.junit.jupiter.api.Test;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.format.DateTimeFormatter;
public class TimeTest {
@Test
public void LocalDateTimeTest() {
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("当前日期时间: " + currentTime);
LocalDate date = currentTime.toLocalDate();
System.out.println("当前日期: " + date);
LocalTime time = currentTime.toLocalTime();
System.out.println("当前时间: " + time);
int year = currentTime.getYear();
System.out.println("当前年份: " + year);
int month = currentTime.getMonthValue();
System.out.println("当前月份: " + month);
int day = currentTime.getDayOfMonth();
System.out.println("当前月中的第几天: " + day);
int hour = currentTime.getHour();
System.out.println("当前小时: " + hour);
int minute = currentTime.getMinute();
System.out.println("当前分钟: " + minute);
int seconds = currentTime.getSecond();
System.out.println("当前秒数: " + seconds);
int nano = currentTime.getNano();
System.out.println("当前毫秒数: " + nano);
LocalDateTime date2 = currentTime.withYear(2012).withMonth(12).withDayOfMonth(12).withHour(12).withMinute(12).withSecond(12).withNano(121212122);
System.out.println("新的日期时间: " + date2);
System.out.println("原来的日期时间: " + currentTime);
LocalDate date1 = LocalDate.of(2022, Month.OCTOBER, 01);
System.out.println("日期是: " + date1);
LocalTime time1 = LocalTime.of(22, 15);
System.out.println("时间是: " + time1);
LocalDateTime datetime = LocalDateTime.parse("2012-10-10T21:58:00");
System.out.println("日期时间是:" + datetime);
LocalDate date3 = LocalDate.parse("2022-10-10");
System.out.println("日期是: " + date3);
LocalTime time3 = LocalTime.parse("22:58:01");
System.out.println("时间是: " + time3);
LocalDate parseDate = LocalDate.parse("2020/12/02", DateTimeFormatter.ofPattern("yyyy/MM/dd"));
System.out.println("解析后的时间: " + parseDate);
String formatDate = parseDate.format(DateTimeFormatter.ofPattern("yyyy//MM//dd"));
System.out.println("格式化后的时间: " + formatDate);
}
}
|