我有两个日期对象,我必须将newTimestamp
日期对象上的时间部分替换为oldTimestamp
日期对象中的时间:
Date oldTimestamp = new Date();
Date newTimestamp = new Date();
我正在使用
newTimestamp.withTime(oldTimestamp.getHourOfDay(),oldTimestamp.getMinuteOfHour(),oldTimestamp.getSecondOfMinute(),000); 那么它应该从oldTimestamp获取小时,分钟和秒并将其设置为newTimestamp吗?但我没有看到它在newTimestamp上正确设置。
答案 0 :(得分:1)
使用Java 8,您可以执行以下操作
LocalDateTime oldDate = LocalDateTime.ofInstant(Instant.now(), ZoneOffset.UTC);
// Thread.sleep(2000);
LocalDateTime replaced = LocalDateTime.ofInstant(Instant.now(), ZoneOffset.UTC)
.withHour(oldDate.getHour())
.withMinute(oldDate.getMinute())
.withSecond(oldDate.getSecond())
.withNano(oldDate.getNano());
System.out.printf("Old date: %s Replaced date: %s", oldDate, replaced);
注意
如果您需要使用Date
个对象,可以
dateObject.toInstant();
https://docs.oracle.com/javase/8/docs/api/java/util/Date.html#toInstant--
此示例使用Instant.now(),因此很容易测试。如果您取消注释与Thread.sleep()
的对齐,您将看到打印出来的日期将是相同的,即使睡眠会导致日期不同。
答案 1 :(得分:0)
您是否意识到java.util.Date
个对象始终是UTC?因此,您不会在蒙特利尔或加尔各答交易时间。如果您想要UTC,请继续阅读,否则请编辑您的问题。
避免使用旧的遗留日期时间类,现在由java.time类取代。 java.util.Date
类被Instant
替换为UTC时间轴上的一个点。
Instant instantNew = newUtilDate.toInstant();
Instant instantOld = oldUtilDate.toInstant();
转换为OffsetDateTime
个对象以启用零件。
OffsetDateTime odtNew = instantNew.atOffset( ZoneOffset.UTC );
OffsetDateTime odtOld = instantOld.atOffset( ZoneOffset.UTC );
现在您可以提取日期部分或时间部分和混合。
LocalDate ld = odtNew.toLocalDate() ;
LocalTime lt = odtOld.toLocalTime() ;
OffsetDateTime odtMix = OffsetDateTime.of( ld , lt , ZoneOffset.UTC );
最好避免遗留类。但是,如果您确实需要java.util.Date
作为结果,请提取Instant
并转换。
java.util.Date d = java.util.Date.from( odtMix.toInstant() );