LocalDate
该类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息。另外,它也不附带任何与时区相关的信息
public class LocalDataTest {
public static void main(String[] args) {
//你可以通过静态工厂方法of创建一个LocalDate实例。LocalDate实例提供了多种方法来读取常用的值,比如年份、月份、星期几等,如下所示。
LocalDate date = LocalDate.of(2014, 3, 18);
System.out.println("date.getYear() = " + date.getYear());
System.out.println("date.getMonth() = " + date.getMonth());
System.out.println("date.getDayOfMonth() = " + date.getDayOfMonth());
System.out.println("date.getDayOfWeek() = " + date.getDayOfWeek());
System.out.println("date.lengthOfMonth() = " + date.lengthOfMonth());
System.out.println("date.isLeapYear() = " + date.isLeapYear());
//你还可以通过传递一个TemporalField参数给get方法拿到同样的信息。
// TemporalField是一个接口,它定 义了如何访问temporal对象某个字段的值。
// ChronoField枚举实现了这一接口,所以你可以很方便地使用get方法得到枚举元素的值
System.out.println("date.get(ChronoField.YEAR) = " + date.get(ChronoField.YEAR));
System.out.println("date.get(ChronoField.MONTH_OF_YEAR) = " + date.get(ChronoField.MONTH_OF_YEAR));
System.out.println("date.get(ChronoField.DAY_OF_MONTH) = " + date.get(ChronoField.DAY_OF_MONTH));
//你还可以使用工厂方法从系统时钟中获取当前的日期:
LocalDate today = LocalDate.now();
System.out.println("today.getDayOfMonth() = " + today.getDayOfMonth());
System.out.println("today.getDayOfWeek() = " + today.getDayOfWeek());
System.out.println("today.getYear() = " + today.getYear());
System.out.println("today.getMonth() = " + today.getMonth().getValue());
}
}
打印信息如下:
date.getYear() = 2014 date.getMonth() = MARCH date.getDayOfMonth() = 18 date.getDayOfWeek() = TUESDAY date.lengthOfMonth() = 31 date.isLeapYear() = false date.get(ChronoField.YEAR) = 2014 date.get(ChronoField.MONTH_OF_YEAR) = 3 date.get(ChronoField.DAY_OF_MONTH) = 18 today.getDayOfMonth() = 20 today.getDayOfWeek() = FRIDAY today.getYear() = 2019 today.getMonth() = 12
LocalTime
类似地,一天中的时间,比如13:45:20,可以使用LocalTime类表示。
public class LocalDataTest2 {
public static void main(String[] args) {
//你可以使用of重载的两个工厂方法创建LocalTime的实例。第一个重载函数接收小时和分钟,第二个重载函数同时还接收秒。
// 同LocalDate一样,LocalTime类也提供了一些getter方法访问这些变量的值,如下所示。
LocalTime time = LocalTime.of(13, 45, 20);
System.out.println("time.getHour() = " + time.getHour());
System.out.println("time.getMinute() = " + time.getMinute());
System.out.println("time.getSecond() = " + time.getSecond());
}
}
打印信息如下:
time.getHour() = 13 time.getMinute() = 45 time.getSecond() = 20
LocalDate和LocalTime还可以通过解析代表它们的字符串创建,使用静态方法parse,你可以实现这一目的。
public class LocalDataTest3 {
public static void main(String[] args) {
//你可以向parse方法传递一个DateTimeFormatter。该类的实例定义了如何格式化一个日期或者时间对象。
//它是替换老版java.util.DateFormat的推荐替代品。
//一旦传递的字符串参数无法被解析为合法的LocalDate或LocalTime对象,这两个parse方法都会抛出一个继承自RuntimeException的DateTimeParseException异常
LocalDate date = LocalDate.parse("2014-03-18");
System.out.println("date.getMonth() = " + date.getMonth().getValue());
LocalTime time = LocalTime.parse("13:45:20");
System.out.println("time.getHour() = " + time.getHour());
}
}
LocalDateTime
这个复合类名叫LocalDateTime,是LocalDate和LocalTime的合体。它同时表示了日期和时间,但不带有时区信息,你可以直接创建,也可以通过合并日期和时间对象构造
public class LocalDataTest4 {
public static void main(String[] args) {
// 2014-03-18T13:45:20
LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
//你也可以使用 或toLocalDate者toLocalTime方法,从LocalDateTime中提取LocalDate或者LocalTime 组件
LocalDate date = dt1.toLocalDate();
LocalTime time = dt1.toLocalTime();
LocalDateTime dt2 = LocalDateTime.of(date, time);
//注意,通过它们各自的atTime或者atDate方法,向LocalDate传递一个时间对象,或者向LocalTime传递一个日期对象的方式,你可以创建一个LocalDateTime对象
LocalDateTime dt3 = date.atTime(13, 45, 20);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime dt5 = time.atDate(date);
}
}
我们可以用比较直观的方式操纵LocalDate的属性
public class LocalDataTest5 {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2014, 3, 18); //2014-3-18
LocalDate date2 = date1.withYear(2011); //2011-3-18
LocalDate date3 = date2.withDayOfMonth(25); //2011-3-25
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9); //2011-9-25
}
}
或者用类似plus方法去操控
public class LocalDataTest6 {
public static void main(String[] args) {
//plus方法也是通用方法,它和minus方法都声明于Temporal接口中。
//通过这些方法,对TemporalUnit对象加上 或者减去一个数字,我们能非常方便地将Temporal对象前溯或者回滚至某个时间段,
//通过 ChronoUnit 枚举我们可以非常方便地实现TemporalUnit接口
LocalDate date1 = LocalDate.of(2014, 3, 18); //2014-3-18
LocalDate date2 = date1.plusWeeks(1); //2014-3-25
LocalDate date3 = date2.minusYears(3); //2011-3-25
LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS); //2011-9-25
}
}
DateTimeFormatter
处理日期和时间对象时,格式化以及解析日期-时间对象是另一个非常重要的功能。新的java.time.format包就是特别为这个目的而设计的。这个包中,最重要的类是DateTime-Formatter。创建格式器最简单的方法是通过它的静态工厂方法以及常量。像BASIC_ISO_DATE 8和ISO_LOCAL_DATE这 样 的 常 量 是DateTimeFormatter类 的 预 定 义 实 例 。 所 有 的 DateTimeFormatter实例都能用于以一定的格式创建代表特定日期或时间的字符串。比如,下面的这个例子中,我们使用了两个不同的格式器生成了字符串:
public class LocalDataTest7 {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2014, 3, 18);
System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE));
System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE));
LocalDate date1 = LocalDate.parse("20140318",
DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date2 = LocalDate.parse("2014-03-18",
DateTimeFormatter.ISO_LOCAL_DATE);
}
}
DateTimeFormatter的ofPattern方法也提供了一个重载的版本,使用它你可以创建某个Locale的格式器
public class LocalDataTest8 {
public static void main(String[] args) {
//DateTimeFormatter的ofPattern方法也提供了一个重载的版本,使用它你可以创建某个Locale的格式器
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate date = LocalDate.of(2014, 3, 18);
System.out.println(date.format(formatter));
//下面为传统的格式化时间类
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
System.out.println(dateFormat.format(System.currentTimeMillis()));
}
}
Date与这几个类的互相转换
public class DateUtil {
/**
* Date转LocalDateTime
*
* @param date
* @return
*/
public static LocalDateTime UDateToLocalDateTime(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone);
}
/**
* Date转LocalDate
*/
public static LocalDate UDateToLocalDate(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalDate();
}
/**
* Date转TimeToUpdate
*/
public static LocalTime UDateToLocalTime(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalTime();
}
/**
* LocalDateTime转Date
*/
public static Date LocalDateTimeToUdate(LocalDateTime localDateTime) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}
/**
* LocalDate转Date
*/
public static Date LocalDateToUdate(LocalDate localDate) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
return Date.from(instant);
}
/**
* LocalTime转Date
*/
public static Date LocalTimeToUdate(LocalTime localTime, LocalDate localDate) {
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}
}