在Java中用Date对象替换Time Part

时间:2017-04-18 20:13:53

标签: java datetime

我有两个日期对象,我必须将newTimestamp日期对象上的时间部分替换为oldTimestamp日期对象中的时间:

Date oldTimestamp = new Date();
Date newTimestamp = new Date();

我正在使用

newTimestamp.withTime(oldTimestamp.getHourOfDay(),oldTimestamp.getMinuteOfHour(),oldTimestamp.getSecondOfMinute(),000); 那么它应该从oldTimestamp获取小时,分钟和秒并将其设置为newTimestamp吗?但我没有看到它在newTimestamp上正确设置。

2 个答案:

答案 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() );