下面是一个使用 between() 方法创建的示例:
Instant first = Instant.now(); // 其他耗时操作 Instant second = Instant.now(); Duration duration = Duration.between(first, second); 访问 Duration 对象的时间信息从上述构造器源码可知,Duration 在内部维护两个值:
final int nanos;
final long seconds;
请注意没有单独的毫秒部分,只有纳秒和秒。但可以可以将整个时间间隔 Duration 转换为其他时间单位,如纳秒、分钟、小时或天:
long toNanos()
long toMillis()
long toMinutes()
long toHours()
long toDays()
toNanos() 与 getNano() 的不同之处在于 getNano() 仅返回持续时间小于一秒的部分(即整个时间段中不到 1 秒的那部分)。 toNanos() 方法返回的是转换为纳秒的整个时间段(即秒部分转成纳秒+纳秒部分)。
没有 toSeconds() 方法,因为 getSeconds() 方法已经可以获取 Duration 的秒部分。
Duration 的计算Duration 类包含一组可用于基于 Duration 对象执行计算的方法。其中一些方法是:
Duration plus(Duration duration)
Duration plusNanos(long)
Duration plusMillis(long)
Duration plusSeconds(long)
Duration plusMinutes(long)
Duration plusHours(long)
Duration plusDays(long)
Duration minusXxx(long) 上面所有对应 minus 方法
这些方法的使用大同小异,一下是一个例子:
Duration start = ... Duration added = start.plusDays(3); // 加 3 天 Duration subtracted = start.minusDays(3); // 减 3 天同样,为了使Duration对象保持不可变,所有计算方法都返回表示计算结果的新的 Duration 对象。
LocalDate 表示本地日期java.time.LocalDate 表示本地日期,没有时区信息。当地的日期可以是生日或法定假日等,与一年中的某一天有关,和一天中的某一时间无关。这个类对象也是不可变的,计算操作会返回一个新的 LocalDate 对象。
下面是一个创建 LocalDate 对象的例子:
还有很多方法可以创建 LocalDate 对象,我列出一部分下面,具体的请查看 JavaDoc 。
访问 LocalDate 中的日期信息LocalDate 中一共有 3 个日期信息字段,分别是:
final int year;
final short month;
final short day;
对应一些获取信息的方法:
int getYear()
Month getMonth()
int getDayOfMonth()
int getDayOfYear()
DayOfWeek getDayOfWeek()
LocalDate 计算LocalDate plusYears(long yearsToAdd)
LocalDate plusMonths(long monthsToAdd)
LocalDate plusWeeks(long weeksToAdd)
LocalDate plusDays(long daysToAdd)
LocalDate minusXxx(long xxxToSubtract) 对应上面 plus 方法的 minus 版本
下面是一个例子:
LocalDate localDate = LocalDate.of(2018, 12, 12); LocalDate localDate1 = localDate.plusYears(3); // 加 3 年 LocalDate localDate2 = localDate.minusYears(3); LocalTime 表示本地时间java.time.LocalTime 表示没有任何时区信息的特定时间,例如,上午 10 点。同样,这是一个不可变类。
下面是一个创建 LocalTime 对象的例子:
LocalTime 内部维护了 4 个变量维护时间信息:
final byte hour;
final byte minute;
final byte second;
final int nano;
也包含了必要的计算时间的方法,例如 LocalTime plusHours(long hoursToAdd); 其他的和 LocalDate 大同小异,就不展开讲了。
LocalDateTime 表示本地日期和时间java.time.LocalDateTime 类表示没有任何时区信息的本地日期和时间,同样是不可变类。
查看其源码发现其内部就是维护了一个 LocalDate 对象和一个 LocalTime 对象来表示日期时间信息。
final LocalDate date; final LocalTime time;所以完全可以把它看成是 LocalDate 和 LocalTime 的结合。
下面是一个创建 LocalDateTime 对象的例子:
上面第二行代码使用 of() 工厂方法创建对象,其参数分别对应年月日时分秒纳秒。
其他获取日期时间信息和计算请参考 LocalDate 和 LocalTime 的。
ZonedDateTime 表示带有时区信息的日期和时间java.time.ZonedDateTime 可以用来代表世界上某个特定事件的开始,比如会议、火箭发射等等。
它同样是不可变类,下面是一个创建此类对象的例子:
时区由 ZoneId 类表示,如前面的示例所示。可以使用 ZoneId.now() 方法创建 ZoneId 对象。也可以使用 of() 方法指定时区信息,下面是一个例子:
ZoneId zoneId1 = ZoneId.of("UTC+1"); ZoneId zoneId2 = ZoneId.of("Europe/Paris");