【问题标题】:Java Calendar considering hours考虑小时数的 Java 日历
【发布时间】:2015-02-18 21:59:30
【问题描述】:

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

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

【问题讨论】:

  • 用户如何在不设置结束日期的情况下指定时间垃圾邮件?
  • 显然属性集(天、开始时间、结束时间)并不像您希望的那样满足您的需求。也许(开始日期、开始时间、持续时间)更适合这个问题。这不仅避免了跨越两个日期的预订问题,它甚至可以容纳多日预订。
  • 所以这是一家按小时出租的不收费汽车旅馆?
  • 谢谢约翰。我还有一个持续时间变量,以计算客户应支付的金额。由于是基于小时的服务(它是一个排练室),我真的不需要用户输入结束日期,但我必须设法在两天之间进行预订。即使听了你的建议,我也有一个想法:我应该创建一个 startCalendar 和一个 endCalendar。因此,如果 endTime 介于 00 和 04 之间,让 endCalendar 增加一天。然后,我可以计算两个日历之间的差异并进行数学计算。但是:我应该使用哪些功能?我错过了代码。

标签: java date time calendar


【解决方案1】:

您可以指定预订房间的天数。然后,您只需将天数添加到您的第一个 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,因为我使用它的程度不足以提供有用的示例。

【讨论】:

    【解决方案2】:

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

    您说您有两个小时和分钟的数据输入字段。将每个文本条目转换为一个数字。 Longparses 一个字符串到 long 原语。

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

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

    关于java.time

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

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

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2012-02-18
      • 2017-01-04
      • 1970-01-01
      相关资源
      最近更新 更多