提示:本阅读大约需要10分钟
一、概述
Java 8 包含了全新的时间日期API,这些功能都放在了java.time包下。有以下几个优点:
- 为保证安全,所有class都不可变且不可继承(final),除abstract和interface以外。每一次方法调用都会产生新的日期时间实例,不影响之前的值。
- 为时区、日期、时间、日期时间、时间戳甚至年、月、日都定义了不同的类,功能分离明显。
- API调用具有链式风格,无论是静态方法还是类方法都有很明确的行为,方法名能表达其中意思。
- 功能全面,几乎所有日期时间类的API都提供加减(日期或时间)、格式化、解析等方法,且能互相转换,方便协作。
二、代码示例
1.LocalDateTime 日期时间
代码如下(示例):
//日期格式化
LocalDateTime sylvester = LocalDateTime.of(2020, Month.DECEMBER,
31, 23, 59, 59);
System.out.println(sylvester);
DayOfWeek dayOfWeek1 = sylvester.getDayOfWeek();
System.out.println(dayOfWeek1);
Month month = sylvester.getMonth();
System.out.println(month);
long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY);
System.out.println(minuteOfDay);
//转成Date对象
Instant instant1 = sylvester.atZone(ZoneId.systemDefault()).toInstant();
System.out.println(Date.from(instant1));
//格式化时间 yMd Hms
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss");
String format = dateTimeFormatter.format(LocalDateTime.now());
System.out.println(format);
2.LocalDate 日期
代码如下(示例):
LocalDate today = LocalDate.now();
System.out.println(today);
//向后推一天
LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
System.out.println(tomorrow);
//向后推两天
LocalDate yesterday = today.minusDays(2);
System.out.println(yesterday);
//计算星期
LocalDate independenceDay = LocalDate.of(2020, Month.DECEMBER, 28);
DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();
System.out.println(dayOfWeek);
DateTimeFormatter germanFormatter1 =
DateTimeFormatter
.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(Locale.GERMAN);
LocalDate xmas = LocalDate.parse("12.12.2020", germanFormatter1);
System.out.println(xmas);
3.LocalTime 本地时间
LocalTime是由多个工厂方法组成,其目的是为了简化对时间对象实例的创建和操 作,包括对时间字符串进行解析的操作。本地时间类表示一个没有指定时区的时间,例如,10 p.m.或者17:30:15,下面的 例子会用上面的例子定义的时区创建两个本地时间对象。然后我们会比较两个时间,并计算它们之间的小时和分钟的不同。
代码如下(示例):
// 创建上海Asia/Shanghai和伦敦Europe/London的时区 测试LocalTime
LocalTime now = LocalTime.now(ZoneId.of("Europe/London"));
LocalTime now1 = LocalTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(now);
System.out.println(now1);
System.out.println(now1.isBefore(now));
//计算两个时区的时间差
long hoursBetween = ChronoUnit.HOURS.between(now, now1);
System.out.println(hoursBetween);
LocalTime of = LocalTime.of(12, 12, 12);
System.out.println(of);
DateTimeFormatter germanFormatter =
DateTimeFormatter
.ofLocalizedTime(FormatStyle.SHORT)
.withLocale(Locale.GERMAN);
LocalTime leetTime = LocalTime.parse("13:37", germanFormatter);
System.out.println(leetTime);
4.Clock 时钟
Clock提供了对当前时间和日期的访问功能。Clock是对当前时区敏感的,并可用于 替代System.currentTimeMillis()方法来获取当前的毫秒时间。当前时间线上的时刻 可以用Instance类来表示。Instance也能够用于创建原先的java.util.Date对象。
代码如下(示例):
//中国默认时区 Asia/Shanghai
Clock clock = Clock.systemDefaultZone();
System.out.println(clock);
//现在距离1970年1月1日的毫秒时间
long millis = clock.millis();
System.out.println(millis);
Instant instant = clock.instant();
//年月日
Date from = Date.from(instant);
System.out.println(from);
5.Timezones 时区
时区类可以用一个ZoneId来表示。时区类的对象可以通过静态工厂方法方便地获 取。时区类还定义了一个偏移量,用来在当前时刻或某时间与目标时区时间之间进 行转换。
代码如下(示例):
//默认时区
System.out.println(ZoneId.systemDefault());
//支持的所有时区
System.out.println(ZoneId.getAvailableZoneIds());
//当前的标准偏移量
System.out.println(ZoneId.of("Asia/Shanghai").getRules());
三、总结
java8强大的日期时间库,省去了以前很多不必要的操作,如果正在开发的项目对时间很敏感的话,那么他会帮你节约大量的时间。