在Java中替换日期对象中的时间部分

在Java中替换日期对象中的时间部分,java,datetime,Java,Datetime,我有两个日期对象,我必须将newTimestamp日期对象上的时间部分替换为oldTimestamp日期对象中的时间: Date oldTimestamp = new Date(); Date newTimestamp = new Date(); 我正在使用 newTimestamp.withTimeoldTimestamp.getHourOfDay,oldTimestamp.getMinuteOfHour,oldTimestamp.getSecondOfMinute,000; 所以它应该从o

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

Date oldTimestamp = new Date();
Date newTimestamp = new Date();
我正在使用

newTimestamp.withTimeoldTimestamp.getHourOfDay,oldTimestamp.getMinuteOfHour,oldTimestamp.getSecondOfMinute,000;
所以它应该从oldTimestamp中获取小时、分钟和秒,并将其设置为newTimestamp,对吗?但是我看不出它在newTimestamp上的设置是否正确。

使用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);

如果需要处理日期对象,可以

dateObject.toInstant();
本例使用Instant.now,因此易于测试。如果取消对Thread.sleep行的注释,您将看到打印出来的日期将是相同的,即使睡眠会导致日期不同。

您是否意识到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() );

日期对象不是不可变的。它有setHours/setMinutes等。我建议查看Javadocs中的日期。@KevinO它有setHours/setMinutes等。@AndyTurner,没错,但这并不意味着该方法不能解决特定的问题。见鬼,我认为使用日期对象本身在这一点上是不推荐的。如果需要,可以使用Calendar或LocalDateTime进行其他旋转。但是,上述问题可以使用不推荐的方法直接解决。@KevinO仅仅因为您可以使用不推荐的方法解决,并不意味着这是一个好建议。只要OP不需要日期对象,这是一个非常好的解决方案。OP的问题,如书面所示,特别指明了日期。@KevinO用日期表示他可以执行Date.toInstant并替换Instant.nowWork,这并不等同于仅限于。换句话说,如果OP可以使用对象而不仅仅是日期对象,那么这种方法就可以了。如果OP不能使用其他对象,这种方法不能回答这个问题。我认为该解决方案很好,是一个很好的参考,但它可能无法直接回答问题。@KevinO我同意你的看法,如果他只能使用Date,那么你已经回答了问题,请使用不推荐的setHours和setMinutes。如果他能够使用其他对象,那么他可以使用此解决方案。LocalDateTime对象故意没有时区或任何偏移量。因此,您正在丢弃有价值的信息。在这里教授OffsetDateTime的用法更合适。