时间线
Java的Date和Time的API都具有以下规范
1、每天86400秒
2、每天正午进行时间精准匹配;
3、其他时间进行接近匹配;
因此Java的时间api能符合官方时间的变化;
Instant类提供了时间的计数;其可以充当时间戳,可以使用其方法比较两个对象,比如isAfter、isBefore判断前后关系;
为了得出时间差,引入了Duration静态类的between方法;然后使用Duration类的getSeconds、toDay、toMinutes、toHours等方法得到自己所需要的值;
可以这样理解,Instant记录了时刻,而Duration用于表示时间长度;
public class TimeTest {
public static void main(String[] args) {
Instant start = Instant.now();
//运行程序
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant end = Instant.now();
System.out.println(start.isAfter(end));//false
Instant min = Instant.MIN;//1970年1月1日
//使用duration进行扩展操作
Duration duration = Duration.between(start, end);
System.out.println(duration.getSeconds());//3
Duration duration2 = Duration.between(min, end);
System.out.println(duration2.toDays());//365243238465
}
}
日期线
本地日期LocalDate
LocalDate是java中的日期对象类,可以使用它来表示带有年月日的日期,构建对象依然可以使用LocalDate的now或of静态方法的形式;
如果需要只表示月和日,可以使用MonthDay类,或者只用年和月使用YearMonth等;
public class DateTest {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate bir = LocalDate.of(2000, Month.JUNE,6);
//可以使用方法计算之后多少天是那个日子;
LocalDate program = LocalDate.of(2021,1,1).plusDays(255);//计算了2021年的第255天
System.out.println("当天是星期"+program.getDayOfWeek().getValue());//获取当天周几
boolean leapYear = program.isLeapYear();//判断是不是闰年
}
}
日期调整器TemporalAdjuster
有时候需要做一些特殊的计算,比如计算当11月的第四个星期五
java中提供了TemporalAdjuster类作为特殊日期管理,提供了很多静态方法;
可以使用TemporalAdjuster类来作为一个规则应用于日期得到结果;
public class TemporalAdjustTest {
public static void main(String[] args) {
LocalDate now = LocalDate.of(2021,11,1);
TemporalAdjuster temporalAdjuster = TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY);
System.out.println(temporalAdjuster.adjustInto(now));//2021.11.26
}
}
本地时间
LocalTime和LocalDateTime用于表示时间日期;
public class LocalDateTimeTest {
public static void main(String[] args) {
LocalDateTime local = LocalDateTime.now();
System.out.println(local);
System.out.println(local.getHour());
}
}
时区时间
Java中使用了IANA的数据库所记录的时区编码ID,通过传入参数实现不同时区的时间表达,ZonedDateTime表示时区时间,参数的最后一位为时区id
ZonedDateTime zonedDateTime = ZonedDateTime.of(local, ZoneId.of("Asia/Shanghai"));
System.out.println(zonedDateTime);
日期格式化
使用格式器DateTimeFormater来格式化时间的输出与输入;
LocalDateTime time = LocalDateTime.now();
//系统格式器
DateTimeFormatter isoLocalDateTime = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//自定义格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
//格式输出
formatter.format(time);
//格式输入
formatter.parse("2020-01-02");
与遗留类的转化
基本是toxxx类方法或者from(xx);进行转化;