java8新特性之时间API操作

java8之前时间操作

在java8之前处理日期和时间的API通常是个让人头疼的问题。比如如果想指定日期,大多数人会这么做:

Calendar cal=Calendar.getInstance();
cal.set(Calendar.HOUR,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
Date date=cal.getTime();

而上面设置的小时因为有偏移量12的缘故,打印的时间是当天中午12点那一刻的时间,如下所示:
在这里插入图片描述
这样以来设置指定时间很繁琐,而且时间格式化SimpleDateFormat又是线程不安全的类,开发中又不得不付出努力来确保线程安全问题,一般会使用ThreadLocal来解决,就像下面这样:

public class DateUtil1 {
    private static final ThreadLocal<DateFormat> messageFormat = new ThreadLocal<DateFormat>();
    private static final String FULL_FORMAT = "yy-MM-dd HH:mm:ss.ms";
    private static final DateFormat getDateFormat() {
        DateFormat format = messageFormat.get();
        if (format == null) {
            format = new SimpleDateFormat(FULL_FORMAT, Locale.getDefault());
            messageFormat.set(format);
        }
        return format;
    }
}

后来接触到第三方库joda-time,这个库封装的一些时间和日期API操作方便易用。如果你对它还不了解的话,不妨可以看一下这篇文章:joda-time入门

java8新的时间和日期API

14年java8后,新的时间和日期操作与joda-time很相似,这是因为新的日期和时间操作是Stephen Colebourne这个人领导并书写的,而他正是三方库joda-time的作者之一。新的时间API确保了操作时间的线程安全性,原理是:当java.time包内时间类其值发生改变时,其如同String类,类的实例是不可变的对象,当改变其值的时候就会新生成对象地址,从而改变其对象地址,以保证支持多线程操作,新的时间操作和管理大大简化开发对时间操作的需求。

本地时间操作

LocateTimeLocateDateLocateDateTime是新的时间操作API,下面是代码演示:

// 取当前日期:
LocalDate today = LocalDate.now(); 
// 根据年月日取日期:
LocalDate crischristmas = LocalDate.of(2019, 06, 25);
// 根据字符串取:
LocalDate endOfFeb = LocalDate.parse("2019-02-28"); // 严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式
LocalDate.parse("2019-2-29"); // 无效日期无法通过:DateTimeParseException: Invalid date
// 取本月第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); 
// 取本月第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2);
// 取本月最后一天,再也不用计算是28,29,30还是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); 
// 取下一天:
LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); 
// 取2017年1月第一个周一,用Calendar很麻烦:
LocalDate firstMondayOf2015 = LocalDate.parse("2017-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2017-01-02

// LocalDateTime常用方法
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate + "\n" + localTime + "\r" + "\n" + LocalDateTime.now());
// 指定时间例如创建2018-6-18,下午5点半
LocalDateTime time = LocalDateTime.of(2019, 6, 18, 17, 30);
System.out.println(time);
// 获取时间,Month底层是用枚举实现的
System.out.println(time.getYear() + "年" + time.getMonthValue()
          + "月" + time.getDayOfMonth() + time.getHour() + "时" +
                time.getMinute() + "分" + time.getSecond() + "秒");
// 修改时间,设置月中天为13,小时为4
LocalDateTime localDateTime1 = time.withDayOfMonth(13);
LocalDateTime loca = time.withHour(4);
 System.out.println(localDateTime1 + "\n" + loca);
 // 时间运算plusXXX方法代表向后添加时间,minusXXX代表向后减少时间
System.out.println(time.plusSeconds(5));
System.out.println(time.minusHours(5));
System.out.println(time.compareTo(localDateTime));
System.out.println(time.isBefore(localDateTime));
System.out.println(time.isAfter(localDateTime));

时间format、parse

JDK8之前的SimpleDateFormat时间格式化存在线程不安全的问题,所幸新提供的DateTimeFormatter 解决了线程不安全的问题,其使用如下所示:

// 时间format
LocalDateTime time = LocalDateTime.of(2019, 6, 18, 17, 30);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = time.format(dateTimeFormatter);
System.out.println(format);
// 时间parse
System.out.println(LocalDateTime.parse(format, dateTimeFormatter));

localDateTime与Date转换

新的api提供的LocalDateTime非常有用,但是开发的过程中通常有将LocalDateTime转化为java.util.Date的需求,其相互转换如下所示:

  • Date 转localDateTime
  // Date 转localDateTime
  Date date = new Date();
  // 将Date转化为Instant
  Instant instant = date.toInstant();
  // 设置Zone时区
  ZoneId zoneId = ZoneId.systemDefault();
  System.out.println(zoneId.toString());
  ZonedDateTime zonedDateTime = instant.atZone(zoneId);
  // 转化为localDateTime
  LocalDateTime localDateTime = zonedDateTime.toLocalDateTime();
  System.out.println(localDateTime);
  • localDateTime转Date
   LocalDateTime now =LocalDateTime.now();
   LocalDateTime localDateTime = now.minusDays(5).minusHours(28).plusMinutes(33);
   // 设置Zone时区
   ZoneId zoneId = ZoneId.systemDefault();
   ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
   Instant instant = zonedDateTime.toInstant();
   Date from = Date.from(instant);
   System.out.println(from);

其他方法


1.	adjustInto		调整指定的Temporal和当前LocalDateTime对
2.	atOffset		结合LocalDateTime和ZoneOffset创建一个
3.	atZone			结合LocalDateTime和指定时区创建一个ZonedD
4.	compareTo		比较两个LocalDateTime
5.	format			格式化LocalDateTime生成一个字符串
6.	from			转换TemporalAccessor为LocalDateTi
7.	get				得到LocalDateTime的指定字段的值
8.	getDayOfMonth	得到LocalDateTime是月的第几天
9.	getDayOfWeek	得到LocalDateTime是星期几
10.	getDayOfYear	得到LocalDateTime是年的第几天
11.	getHour			得到LocalDateTime的小时
12.	getLong			得到LocalDateTime指定字段的值
13.	getMinute		得到LocalDateTime的分钟
14.	getMonth		得到LocalDateTime的月份
15.	getMonthValue	得到LocalDateTime的月份,从112
16.	getNano			得到LocalDateTime的纳秒数
17.	getSecond		得到LocalDateTime的秒数
18.	getYear			得到LocalDateTime的年份
19.	isAfter			判断LocalDateTime是否在指定LocalDateT
20.	isBefore		判断LocalDateTime是否在指定LocalDateT
21.	isEqual			判断两个LocalDateTime是否相等
22.	isSupported		判断LocalDateTime是否支持指定时间字段或单元
23.	minus			返回LocalDateTime减去指定数量的时间得到的值
24.	minusDays		返回LocalDateTime减去指定天数得到的值
25.	minusHours		返回LocalDateTime减去指定小时数得到的值
26.	minusMinutes	返回LocalDateTime减去指定分钟数得到的值
27.	minusMonths		返回LocalDateTime减去指定月数得到的值
28.	minusNanos		返回LocalDateTime减去指定纳秒数得到的值
29.	minusSeconds	返回LocalDateTime减去指定秒数得到的值
30.	minusWeeks		返回LocalDateTime减去指定星期数得到的值
31.	minusYears		返回LocalDateTime减去指定年数得到的值
32.	now				返回指定时钟的当前LocalDateTime
33.	of				根据年、月、日、时、分、秒、纳秒等创建LocalDateTi
34.	ofEpochSecond	根据秒数(1970-01-0100:00:00开始)创建L
35.	ofInstant		根据Instant和ZoneId创建LocalDateTim
36.	parse			解析字符串得到LocalDateTime
37.	plus			返回LocalDateTime加上指定数量的时间得到的值
38.	plusDays		返回LocalDateTime加上指定天数得到的值
39.	plusHours		返回LocalDateTime加上指定小时数得到的值
40.	plusMinutes		返回LocalDateTime加上指定分钟数得到的值
41.	plusMonths		返回LocalDateTime加上指定月数得到的值
42.	plusNanos		返回LocalDateTime加上指定纳秒数得到的值
43.	plusSeconds		返回LocalDateTime加上指定秒数得到的值
44.	plusWeeks		返回LocalDateTime加上指定星期数得到的值
45.	plusYears		返回LocalDateTime加上指定年数得到的值
46.	query			查询LocalDateTime
47.	range			返回指定时间字段的范围
48.	toLocalDate		返回LocalDateTime的LocalDate部分
49.	toLocalTime		返回LocalDateTime的LocalTime部分
50.	toString		返回LocalDateTime的字符串表示
51.	truncatedTo		返回LocalDateTime截取到指定时间单位的拷贝
52.	until			计算LocalDateTime和另一个LocalDateTi
53.	with			返回LocalDateTime指定字段更改为新值后的拷贝
54.	withDayOfMonth	返回LocalDateTime月的第几天更改为新值后的拷贝
55.	withDayOfYear	返回LocalDateTime年的第几天更改为新值后的拷贝
56.	withHour		返回LocalDateTime的小时数更改为新值后的拷贝
57.	withMinute		返回LocalDateTime的分钟数更改为新值后的拷贝
58.	withMonth		返回LocalDateTime的月份更改为新值后的拷贝
59.	withNano		返回LocalDateTime的纳秒数更改为新值后的拷贝
60.	withSecond		返回LocalDateTime的秒数更改为新值后的拷贝
61.	withYear		返回LocalDateTime年份更改为新值后的拷贝

以上是常用的一些API,平时工作中需要拿过来查看API,就可以在项目中使用。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值