Java 考虑小时数的日历

Java Calendar considering hours

大家好!
我正在编写一个软件来跟踪房间预订。每个房间都有预订日期、开始时间、结束时间。问题是我可能会在两天之间进行预订(例如,从 18-02-2015 23:00 到 19-02-2015)。
如何在不要求用户插入结束日期的情况下自动执行此增加的过程?

我使用 Calendar 作为日期,但对于小时和分钟,我只是从两个 TextFields 中获取值。

您可以指定预订房间的天数。然后您只需将天数添加到您的第一个 Calendar 对象。
如何以简单的方式添加天数的工作示例:

int days = 2; //default duration, placeholder
Calendar now = Calendar.getInstance();
Calendar end = (Calendar) now.clone();
    end.add(Calendar.DATE, days);

然后 Calendar end 将被设置为两天后的当前时间。

通常我不建议使用 Object.clone(),但 this answer 表示这样做是安全的。

旧的 Calendar-API(只有一个 Calendar)无法预测时间跨度。但是,如果您可以使用新的 Java 8 日期和时间 API,则可以使用 Periods und Durations。如果您需要确定预订的持续时间,它们可能会有用。
但是,我只能建议您查看 API,因为我对它的使用还不够多,无法提供有用的示例。

tl;博士

ZonedDateTime.of( 2015 , Month.FEBRUARY , 18 , 23 , 0 , 0 , 0 , ZoneId.of( "Europe/Paris" ) )
             .plus( Duration.ofHours( 3 ) )

2015-02-19T02:00:00+01:00[Europe/Paris]

java.time

接受的答案使用过时的旧遗留日期时间 classes 已被证明非常麻烦和混乱。现在被 java.time classes.

取代

要在时间轴上指定时刻,请包括时区以提供日期和时间的上下文。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2015 , Month.FEBRUARY , 18 , 23 , 0 , 0 , 0 , z );

跟踪您预留的小时数作为 Duration

Duration duration = Duration.ofHours( 3 );

ZonedDateTime class 知道如何用 Duration 做数学运算。

ZonedDateTime zdtStop = zdtStart.plus( duration );

您说您有两个数据输入字段,用于显示小时和分钟。将每个文本条目转换为数字。 Long class parses 字符串到 long 原语。

从这些数字中得到 Duration 小时和分钟。

Duration duration = Duration.ofHours( Long.parseLong( hoursEntry ) )
                            .plusMinutes( Long.parseLong( minutesEntry ) ) ;

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8 and SE 9 及更高版本
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and SE 7
  • Android
    • ThreeTenABP 项目专门为 Android 改编 ThreeTen-Backport(如上所述)。
    • 参见

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.