tl;博士
Instant stop =
myUtilDateStart.toInstant()
.plus( Duration.ofMinutes( x ) )
;
java.time
其他答案是正确的,尤其是the Answer by Borgwardt。但是这些答案使用过时的遗留类。
与 Java 捆绑的原始日期时间类已被 java.time 类取代。在 java.time 类型中执行您的业务逻辑。仅在需要使用尚未更新以处理 java.time 类型的旧代码时才转换为旧类型。
如果您的Calendar 实际上是GregorianCalendar,您可以转换为ZonedDateTime。查找添加到旧类的新方法,以促进与 java.time 类型之间的转换。
if( myUtilCalendar instanceof GregorianCalendar ) {
GregorianCalendar gregCal = (GregorianCalendar) myUtilCalendar; // Downcasting from the interface to the concrete class.
ZonedDateTime zdt = gregCal.toZonedDateTime(); // Create `ZonedDateTime` with same time zone info found in the `GregorianCalendar`
end if
如果您的Calendar 不是Gregorian,请调用toInstant 以获取Instant 对象。 Instant 类代表UTC 中时间轴上的一个时刻,分辨率为nanoseconds。
Instant instant = myCal.toInstant();
同样,如果以 java.util.Date 对象开头,则转换为 Instant。 Instant 类代表UTC 时间线上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。
Instant instant = myUtilDate.toInstant();
应用时区以获得ZonedDateTime。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
要获取java.util.Date 对象,请通过Instant。
java.util.Date utilDate = java.util.Date.from( zdt.toInstant() );
有关在传统日期时间类型和 java.time 之间转换的更多讨论以及漂亮的图表,请参阅my Answer 到另一个问题。
Duration
将时间跨度表示为Duration 对象。您输入的持续时间是问题中提到的分钟数。
Duration d = Duration.ofMinutes( yourMinutesGoHere );
您可以将其添加到开始以确定停止。
Instant stop = startInstant.plus( d );
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到 java.time。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。