时间处理
Java1.0有一个Date类,事后证明它过于简单,当Java1.1引入Calendar类之后,Date类中的大部分方法就被弃用了。但是,Calendar的API还不够给力,它的实例是易变的,并且它没有处理诸如闰秒这样的问题。Java SE8中引入的Java.time.API,它修正了过去的缺陷。
calendar是共享变量,并且这个共享变量没有做线程安全控制。当多个线程同时使用相同的SimpleDateFormat对象【如用static修饰的SimpleDateFormat】调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值 另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。
在Java中,Instant表示事件线上的某个点。被称为“新纪元”的事件线原点被设置为穿过伦敦格林威治皇家天文台的本初子午线所处时区的1970年1月1日的午夜。从该原点开始,时间按照每天86400秒先前或向回度量,及渠道纳秒。
LocalDate是带有年、月、日的日期。为了构建LocalDate对象,可以用now或of静态方法:
LocalDate today=LocalDate.now();
LocalDate alonezosBirthday=LocalDate.of(1993,10,8);
alonezosBirthday=LocalDate.of(1993, Month.OCTOBER,8);
LocalDate的方法:
除了LocalDate之外,还有MonthDay、YearMonth和Year类可以描述部分日期。
日期调整器
对于日期安排应用来说,经常需要计算诸如“每个月的第一个星期二”这样的日期。TemporalAdjusters类提供了大量用于常见调整的静态方法。可以将调整方法的结果传递给with方法。例如,某个月的第一个星期二计算方法如下:
LocalDate firstTuesdat=LocalDate.from(1993,10,1).with(
TemporalAdjusters.nextOrSame(DayOfWeek.THURSDAY)
);
}
TemporalAdjusters类中的日期调整器:
还可以通过实现TemporalAdjuster接口来创建自己的调整器。
本地时间
LocalTime表示当日时刻,可以用now或of方法创建其实例:
LocalTime rightNow=LocalTime.now();
LocalTime bedtime=LocalTime.of(23,23,23);
LocalTime的方法:
注:plus和minus操作是按照一天24小时循环操作的。
此外,LocalDateTime可以设置年月日时分秒,相当于LocalDate + LocalTime.