如何在java.time.Instant中获取和设置指定的时间?
我有两个 java.time.Instant 对象
Instant dt1;
Instant dt2;
我想从dt2获取时间(只有小时和分钟没有日期)并将其设置为dt1。最好的方法是什么?用
dt2.get(ChronoField.HOUR_OF_DAY)
throws java.time.temporal.UnsupportedTemporalTypeException
我有两个 java.time.Instant 对象
Instant dt1;
Instant dt2;
我想从dt2获取时间(只有小时和分钟没有日期)并将其设置为dt1。最好的方法是什么?用
dt2.get(ChronoField.HOUR_OF_DAY)
throws java.time.temporal.UnsupportedTemporalTypeException
您必须在某个时区解释即时才能获得ZonedDateTime
。作为即时测量的划线秒和纳米秒,您应该使用该时间来获取与即时打印相同的时间。( ≙ 祖鲁时间 ≙1970-01-01T00:00:00Z
UTC
Z
UTC
)
Instant instant;
// get overall time
LocalTime time = instant.atZone(ZoneOffset.UTC).toLocalTime();
// get hour
int hour = instant.atZone(ZoneOffset.UTC).getHour();
// get minute
int minute = instant.atZone(ZoneOffset.UTC).getMinute();
// get second
int second = instant.atZone(ZoneOffset.UTC).getSecond();
// get nano
int nano = instant.atZone(ZoneOffset.UTC).getNano();
还有一些方法可以获取日,月和年()。getX
即时是不可变的,因此您只能通过创建具有给定时间变化的即时副本来“设置”时间。
instant = instant.atZone(ZoneOffset.UTC)
.withHour(hour)
.withMinute(minute)
.withSecond(second)
.withNano(nano)
.toInstant();
还有一些方法可以改变日,月和年(),以及添加()或减去()时间或日期值的方法。withX
plusX
minusX
要将时间设置为字符串形式的值,请使用:.with(LocalTime.parse("12:45:30"))
Instant
没有任何小时/分钟。请阅读即时类的文档:https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html
如果您使用系统时区来转换即时,则可以使用如下内容:
LocalDateTime ldt1 = LocalDateTime.ofInstant(dt1, ZoneId.systemDefault());
LocalDateTime ldt2 = LocalDateTime.ofInstant(dt2, ZoneId.systemDefault());
ldt1 = ldt1
.withHour(ldt2.getHour())
.withMinute(ldt2.getMinute())
.withSecond(ldt2.getSecond());
dt1 = ldt1.atZone(ZoneId.systemDefault()).toInstant();