目录
TemporalAmount是Java.time包下的一个接口,表示一段具体的时间(如:5天、1小时、3分钟等),时间可以是负数。TemporalAmount有两个常见的实现类:Duration和Period。
在开始前,对TemporalUnit有所了解可以更容易阅读本文。
Duration是基于时间的实现,存储秒和纳秒,但使用其他基于持续时间的单位提供一些访问,如分钟、小时和固定的24小时天。
1、static Duration of(long amount, TemporalUnit unit):通过指定的数量和时间单位创建
2、static Duration ofDays(long days):创建指定天数
3、static Duration ofHours(long hours):创建指定小时数
4、static Duration ofMinutes(long minutes):创建指定分钟数
5、static Duration ofSeconds(long seconds):创建指定秒数
6、static Duration ofSeconds(long seconds, long nanoAdjustment):创建指定秒数+纳秒数
7、static Duration ofMillis(long millis):创建指定微秒数
8、static Duration ofNanos(long nanos):创建指定纳秒数
9、static Duration parse(CharSequence text):解析指定字符序列来得到一个Duration对象,字符序列的格式说明如下,我们常见的java.lang.String就是CharSequence的一个实现类。
"PT20.345S" :会被解析为20.345秒
"PT15M" :会被解析为15分钟
"PT10H" :会被解析为10小时
"P2D" :会被解析为2天
"P2DT3H4M" :会被解析为2天3小时4分钟
"P-6H3M" :会被解析为-6小时+3分钟
"-P6H3M" :会被解析为-6小时-3分钟
"-P-6H+3M" :会被解析为+6小时3分钟
1、long get(TemporalUnit unit):用于获取时间中包含的秒数或纳秒数,该方法只接受ChronoUnit.SECONDS和ChronoUnit.NANOS,否则抛出异常。当给定时间是整数的秒时,获取纳秒为0,因为Duration通过秒和纳秒保存时间,会先创建一个0秒0纳秒的时间,然后在这个基础上增加,满10^9纳秒进1
public static final Duration ZERO = new Duration(0, 0);
方法的源码如下:
- public long get(TemporalUnit unit) {
- if (unit == SECONDS) {
- return seconds;
- } else if (unit == NANOS) {
- return nanos;
- } else {
- throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
- }
- }
2、public Duration abs():返回当前时间的绝对值,如:PT-1.3S会变成PT1.3S
3、Duration dividedBy(long divisor):除法运算
- Duration duration = Duration.of(10, ChronoUnit.DAYS); // PT10D
-
- // 10天=240小时 240小时/3=80小时,不能通过天数完整表示,转化为小时表示
- System.out.println(duration.dividedBy(3)); // PT80H
4、long getSeconds():获取秒数
5、int getNano():获取纳秒数(如果给定时间不是整数秒时返回非0)
6、List
1、boolean isNegative():判断时间是否负数
2、boolean isZero():判断时间是否为0(seconds和nanos都为0)
3、Duration negated():返回给定时间的相反数
1、Duration plus(Duration duration):两个时间相加
2、Duration plus(long amountToAdd, TemporalUnit unit):指定时间单位添加,如:
- Duration duration = Duration.of(10, ChronoUnit.DAYS); // PT240H
- // 加5天
- System.out.println(duration.plus(5, ChronoUnit.DAYS)); // PT360H
3、Duration plusDays(long daysToAdd):增加指定天数
4、Duration plusHours(long hoursToAdd):增加指定小时数
5、Duration plusMinutes(long minutesToAdd):增加指定分钟数
6、Duration plusSeconds(long secondsToAdd):增加指定秒数
7、Duration plusMillis(long millisToAdd):增加指定微秒数
8、Duration plusNanos(long nanosToAdd):增加指定纳秒数
1、Duration minus(Duration duration):减少指定小时数
2、Duration minus(long amountToSubtract, TemporalUnit unit):减少指定时间数
- Duration duration = Duration.of(10, ChronoUnit.DAYS); // PT240H
- // 减5天,即120小时
- System.out.println(duration.minus(5, ChronoUnit.DAYS)); // PT120H
3、Duration minusDays(long daysToSubtract):减少指定天数
4、Duration minusHours(long hoursToSubtract):减少指定小时数
5、Duration minusMinutes(long minutesToSubtract):减少指定分钟数
6、Duration minusSeconds(long secondsToSubtract):减少指定秒数
7、Duration minusMillis(long millisToSubtract):减少指定微秒数
8、Duration minusNanos(long nanosToSubtract):减少指定纳秒数
1、long toDays():转化为天数
2、long toHours():转化为小时数
3、long toMinutes():转化为分钟数
4、long toMillis():转化为微秒数
5、long toNanos():转化为纳秒数
1、Duration withSeconds(long seconds):使用给定秒替换当前时间的秒数生成一个新的时间
- public class DurationExample {
- public static void main(String[] args) {
- Duration nanos = Duration.ofNanos(6); // 6纳秒
- Duration duration = nanos.withSeconds(5); // 5秒
-
- System.out.println(duration); // PT5.000000006S
- }
-
- }
2、Duration withNanos(int nanoOfSecond):使用给定纳秒替换当前时间的纳秒数生成一个新的时间
- public class DurationExample {
- public static void main(String[] args) {
- Duration seconds = Duration.ofMinutes(10); // 10分钟
- Duration duration = seconds.withNanos(5); // 5纳秒
-
- System.out.println(duration); // PT10M0.000000005S
- }
-
- }
Period是一个基于日期的实现,存储年、月和天。
1、static Period ofYears(int years):创建指定年数
2、static Period ofMonths(int months):创建指定月数
3、static Period ofWeeks(int weeks):创建指定周数
4、static Period ofDays(int days):创建指定天数
5、static Period between(LocalDate start, LocalDate end):计算end和start之间间隔的时间,时间的单位以end的单位为准
6、static Period parse(CharSequence text):通过解析指定字符序列生成Period对象(注意:字符序列格式为"P+[数字]+[Y/M/D]"),例如"P3M4D5"表示3年4个月5天
7、static Period from(TemporalAmount amount):从指定对象创建,作用相当于复制
1、IsoChronology getChronology():获取此时期的年表,即ISO日历系统。年表表示正在使用的日历系统
2、long get(TemporalUnit unit):获取指定的单位数,该方法只接收YEARS、MONTHS和DAYS
- public class PeriodExample {
- public static void main(String[] args) {
- Period period = Period.of(5, 6, 7);
-
- System.out.println(period.get(ChronoUnit.YEARS)); // 获取年数:5
- System.out.println(period.get(ChronoUnit.MONTHS)); // 获取月数:6
- System.out.println(period.get(ChronoUnit.DAYS)); // 获取天数:7
- }
-
- }
3、Period normalized():将时间标准化,例如:“5年零15个月”的期间将被标准化为“6年零3个月”
- public class PeriodExample {
- public static void main(String[] args) {
- Period period = Period.of(5, 15, 7);
-
- System.out.println(period.normalized()); // P6Y3M7D
- }
-
- }
4、long toTotalMonths():将当前时间转为月数
- public class PeriodExample {
- public static void main(String[] args) {
- Period period = Period.of(5, 6, 7); // 5年6个月零7天
-
- // 转为月:5*12+6=66,7天不足一个月,舍弃
- System.out.println(period.toTotalMonths()); // 66
- }
-
- }
5、Period withYears(int years):使用指定年数替换当前时间的年数生成一个新的时间
6、Period withMonths(int months):使用指定月数替换当前时间的月数生成一个新的时间
7、Period withDays(int days):使用指定天数替换当前时间的天数生成一个新的时间
8、Period multipliedBy(int scalar):当前时间乘以指定的数值
- public class PeriodExample {
- public static void main(String[] args) {
- Period period = Period.of(5, 6, 7); // PT5Y6M7D
-
- System.out.println(period.multipliedBy(5)); // PT25Y30M35D
- }
-
- }
9、Temporal subtractFrom(Temporal temporal):从指定时间中减掉当前时间
- public class PeriodExample {
- public static void main(String[] args) {
- Period period = Period.of(5, 6, 7);
-
- System.out.println(period.subtractFrom(LocalDate.now())); // 2017-03-14
- }
-
- }
因为以上创建Period时指定了年月日,所以传入的Temporal 至少需要包含年月日,可选LocalDate和LocalDateTime。Temporal常见的实现类有Year(年)、YearMonth(年月)、LocalTime(时分秒)、LocalDate(年月日)和LocalDateTime(年月日 时分秒)。
- public class PeriodExample {
- public static void main(String[] args) {
- Period period = Period.ofYears(365);
-
- System.out.println(period.subtractFrom(Year.of(366))); // 1
- }
-
- }