考虑小时的Java日历

时间:2015-02-18 21:59:30

标签: java date time calendar

嗨伙计们!
我正在写一个软件来跟踪房间预订。每间客房均提供预订,开始时间和结束时间。问题是我可能在两天之间预订(例如,2015年2月18日23:00至2015年2月19日)。
如何在不要求用户插入结束日期的情况下自动执行此增加的过程?

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

2 个答案:

答案 0 :(得分:0)

您可以指定预订房间的天数。然后,您只需要为第一个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 Date and Time API,则可以使用Periods und Durations。如果您需要确定预订的持续时间,它们可能会有用 但是,我可以建议您查看API,因为我没有使用它来提供一个有用的示例。

答案 1 :(得分:0)

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 [欧洲/巴黎]

java.time

接受的答案使用过时的旧遗留日期时间类,这些类已被证明是如此麻烦和令人困惑。现在取代了java.time类。

要在时间线上指定片刻,请添加时区以显示日期和时间。

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类知道如何使用Duration进行数学运算。

ZonedDateTime zdtStop = zdtStart.plus( duration );

你说你有几个小时和分钟的数据输入字段。将每个文本条目转换为数字。 Longparseslong原语的字符串。

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

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

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore