spring boot 最佳实践(三)--使用java.time

java.time由5个包组成参考
- java.time – 包含值对象的基础包
- java.time.chrono – 提供对不同的日历系统的访问
- java.time.format – 格式化和解析时间和日期
- java.time.temporal – 包括底层框架和扩展特性
- java.time.zone – 包含时区支持的类

基本API

日期 LocalDate

LocalDate是其中最重要的类之一。它是表示日期的不可变类型,不包含时间和时区。

LocalDate date = LocalDate.of(2014, Month.JUNE, 10);
int year = date.getYear(); // 2014年
Month month = date.getMonth(); // 6月
int dom = date.getDayOfMonth(); // 10
DayOfWeek dow = date.getDayOfWeek(); // 星期二
int len = date.lengthOfMonth(); // 30 (6月份的天数)
boolean leap = date.isLeapYear(); // false (不是闰年)

由于LocalDate是不可变类型,每次操作都会产生一个新的实例,而原有实例不收任何影响。

LocalDate date = LocalDate.of(2014, Month.JUNE, 10);
date = date.withYear(2015); // 2015-06-10
date = date.plusMonths(2); // 2015-08-10
date = date.minusDays(1); // 2015-08-09

时间 LocalTime

LocalTime是值类型,且跟日期和时区没有关联。当我们对时间进行加减操作时,以午夜基准,24小时一个周期。因此,20:00加上6小时,结果就是02:00。

LocalTime time = LocalTime.of(20, 30);
int hour = date.getHour(); // 20
int minute = date.getMinute(); // 30
time = time.withSecond(6); // 20:30:06
time = time.plusMinutes(3); // 20:33:06

时间和日期组合LocalDateTime

LocalDateTime是LocalDate和LocalTime的简单组合。它表示一个跟时区无关的日期和时间。LocalDateTime可以直接创建,或者组合时间和日期:

LocalDateTime dt1 = LocalDateTime.of(2014, Month.JUNE, 10, 20, 30);
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(20, 30);
LocalDateTime dt4 = date.atTime(time);

LocalDateTime的其他方法跟LocalDate和LocalTime相似。下面总结了用到的方法前缀:

方法前缀详细信息
of静态工厂方法,从组成部分中创建实例
from静态工厂方法,尝试从相似对象中提取实例。from()方法没有of()方法类型安全
now静态工厂方法,用当前时间创建实例
parse静态工厂方法,总字符串解析得到对象实例
get获取时间日期对象的部分状态
is检查关于时间日期对象的描述是否正确
with返回一个部分状态改变了的时间日期对象拷贝
plus返回一个时间增加了的、时间日期对象拷贝
minus返回一个时间减少了的、时间日期对象拷贝
to把当前时间日期对象转换成另外一个,可能会损失部分状态
at用当前时间日期对象组合另外一个,创建一个更大或更复杂的时间日期对象
format提供格式化时间日期对象的能力

时间点Instant

Instant表示自1970年1月1日0时0分0秒(UTC)开始的秒数。用于机器可读的时间存储。Instant的精度可以达到纳秒级。

Instant start = Instant.now();
// perform some calculation
Instant end = Instant.now();
assert end.isAfter(start);

时间修改器TemporalAdjuster

时间修改器TemporalAdjuster类提供一个预装包的、能操纵日期的功能,比如根据月份的最后一天获取日期的对象。

//import static java.time.DayOfWeek.*
//import static java.time.temporal.TemporalAdjusters.*
LocalDate date = LocalDate.of(2014, Month.JUNE, 10);
date = date.with(lastDayOfMonth());
date = date.with(nextOrSame(WEDNESDAY));

时间长度Duration

Duration表示以秒和纳秒为基准的时长。例如,“23.6秒”。Period表示以年、月、日衡量的时长。例如,“3年2个月零6天”。它们可以作为参数,传给主要的时间/日期类的增加或减少时间的方法:

Period sixMonths = Period.ofMonths(6);
LocalDate date = LocalDate.now();
LocalDate future = date.plus(sixMonths);

解析和格式化DateTimeFormatter

DateTimeFormatter是最通用的创建格式化器的方式。包括:

  • 常用ISO格式常量,如ISO_LOCAL_DATE
  • 字母模式,如ofPattern(“dd/MM/uuuu”)
  • 本地化样式,如ofLocalizedDate(FormatStyle.MEDIUM)
DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uuuu");
LocalDate date = LocalDate.parse("24/06/2014", f);
String str = date.format(f);

时间比较

//时间大小
dayOne.isBefore(dayTwo);
//时间差
long between = ChronoUnit.MONTHS.between(dayOne, dayTwo);

新旧版本兼容参考

//java.util.Date转LocalDate;
Date input = new Date();
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
JDK8类From JDK8to JDK8JDK7类
java.time.Instantjava.util.Date
Date.from(instant)date.toInstant()
java.time.Instantjava.sql.Timestamp
Timestamp.from(instant)ts.toInstant()
java.time.Instantjava.nio.file.attribute.FileTime
FileTime.from(instant)fileTime.toInstant()
ZonedDateTimejava.util.GregorianCalendar
GregorianCalendar.from(zonedDateTime)cal.toZonedDateTime()
LocalDatejava.sql.Time
Date.valueOf(localDate)date.toLocalDate()
java.time.LocalTimejava.sql.Time
Date.valueOf(localDate)date.toLocalTime()
LocalDateTimejava.sql.Timestamp
Timestamp.valueOf(localDateTime)ts.toLocalDateTime()
java.time.ZoneIdjava.util.TimeZone
Timezone.getTimeZone(id)timeZone.toZoneId()
DateTimeFormatterjava.text.DateFormat
formatter.toFormat()

更多资料

官方文档:http://docs.oracle.com/javase/tutorial/datetime/TOC.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值