【问题标题】:How can I compare hours?如何比较小时数?
【发布时间】:2019-01-27 00:23:15
【问题描述】:

我正在构建一个应用程序,我需要知道如何比较两个小时。

例如,我的商店早上 6:30 开门,下午 5:00 关门。

我需要在TextView 中表明我的商店在下午 5 点后关门,在早上 6:30 后我的商店在周一至周五营业。

我该怎么做?这是我的尝试:

public void timer() {
    Calendar c = Calendar.getInstance();
    int timeOfDay = c.get(Calendar.HOUR_OF_DAY);
    int open = 6:30; // 1 ERROR HERE WITH ":"
    int close = 17;

    if (timeOfDay < close) {
        hour.setText.("OPEN");
    }
}

但是我遇到了多个错误。当我将 06:30 与“:”放在一起时,一个 int open;两个,周一到周五的限制。

感谢您的帮助。

【问题讨论】:

标签: java android time hour java.util.calendar


【解决方案1】:

您应该使用 Java 8 日期和时间库,因为日历和日期已过时。

LocalTime 类应该足够了。

LocalTime open = LocalTime.of(6, 30);
LocalTime closed = LocalTime.of(17, 0);

LocalTime currentTime = LocalTime.now();
if (currentTime.isBefore(open) || currentTime.isAfter(closed)) {
    // Closed
}

然后您可以使用DateTimeFormatter 类将时间格式化为所需的格式。

如果您想在确定商店的营业时间时也考虑星期几,那么您可以结合上述示例使用LocalDateTime

LocalDateTime now = LocalDateTime.now();

// The opening days. Static import these from java.time.DayOfWeek
Set<DayOfWeek> daysOpen = new HashSet<>(Arrays.asList(
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY));
// Opening and closing times
LocalTime timeOpen = LocalTime.of(6, 30);
LocalTime timeClosed = LocalTime.of(17, 0);

if (!daysOpen.contains(now.getDayOfWeek()) || now.toLocalTime().isBefore(timeOpen) || now.toLocalTime().isAfter(timeClosed)) {
    System.out.println("Closed");
}
else {
    System.out.println("Open");
}

【讨论】:

  • 对于 API 级别 26 之前的 Android,您需要:github.com/JakeWharton/ThreeTenABP
  • :( 不起作用给我看这个Failed resolution of: Ljava/time/LocalTime,我按照链接中的步骤操作,也不起作用
  • 从 API 级别 26 开始支持 Java 8。如果您的目标是较低的 API 级别,那么您可以改用 Joda Time。 More info herehere.
  • 或者只包括 ThreeTenAPB,就像@leonardkraemer 提到的那样。
【解决方案2】:

常量HOUR_OF_DAY 是一个仅表示小时的整数。我建议使用 getTime() (see this link) 方法,然后使用返回的 Date 对象。

【讨论】:

    【解决方案3】:

    我想不出一个非常简洁的方法来做到这一点,但也许你可以使用这种方法

    public boolean isOpen(Calendar c) {
       int minute = c.get(Calendar.MINUTE);
       int hour = c.get(Calendar.HOUR_OF_DAY);
       return (hour < 17 && (hour > 6 || (hour == 6 && minute >=30)));
    }
    

    如果它在 6:30 到 17:00 之间应该返回 true,在任何其他时间返回 false

    (如果小时小于 17,并且 (小时大于 6,或小时为 6,分钟为 30 或更高))

    【讨论】:

      【解决方案4】:

      使用以下代码:

              Calendar openingHour = Calendar.getInstance();
              openingHour.set(Calendar.HOUR_OF_DAY, 6);
              openingHour.set(Calendar.MINUTE, 30);
              openingHour.set(Calendar.SECOND, 0);
              openingHour.set(Calendar.MILLISECOND, 0);
      
              Calendar closingHour = Calendar.getInstance();
              closingHour.set(Calendar.HOUR_OF_DAY, 17);
              closingHour.set(Calendar.MINUTE, 0);
              closingHour.set(Calendar.SECOND, 0);
              closingHour.set(Calendar.MILLISECOND, 0);
      
              Calendar currentTime = Calendar.getInstance();
              int dayOfWeek = currentTime.get(Calendar.DAY_OF_WEEK);
              if( dayOfWeek % 7 > 1  && currentTime.before(closingHour) && currentTime.after(openingHour)){
                 System.out.println("Store is open");
              } else {
                 System.out.println("Store is closed");
              }
      

      【讨论】:

      • 工作正常 :),但我怎么能以两种格式小时 thnks 完成这项工作
      • 两小时格式是什么意思?给我样本输出
      • 例如,我的手机使用00到12的格式,而另一部手机的17:00pm就是5:00pm,格式是24,所以17:00就是17:00
      • 与您的设备时间格式无关,是24小时格式还是12小时格式。当您从日历中获取 HOUR_OF_DAY 时,它会以 24 格式返回您的时间;)如果您想要字符串格式,请随时告诉我发送代码 sn-p 以格式化您的输出 :)
      • 我怎么能改变这个 17,你知道在哥伦比亚这里是 4:pm = 14:00 并显示关闭的 jejeje,因为在代码中你放了 17,而 04 在那之前打开
      【解决方案5】:

      HOUR_OF_DAY field 是这样工作的。

      10:04:15 PM the HOUR_OF_DAY is 22.
      

      你不能得到6:30 am,因为它只告诉你几小时不是一分钟。

      您可以拨打MINUTE获取分钟数。

      一些变化是:

      public void timer () {
          Calendar c = Calendar.getInstance();
          int timeOfDay = c.get(Calendar.HOUR_OF_DAY);
          int minuteOfHour = c.get(Calendar.MINUTE); -> same as Hour
          int open = 6; -> you shouldn't use ':' with an int
          int openMinutes = 30;
          int close = 17;
      
          if(timeOfDay >= open && minuteOfHour >= openMinutes && timeOfDay < close){
              hour.setText.("OPEN");
          }}
      

      【讨论】:

      • 对不起,您的回答很好地说明了为什么 Calendar 类被放弃并被 java.time(现代 Java 日期和时间 API)取代。如果现在时间是早上 8:05,minuteOfHour 将小于 openMinutes,并且您的商店将显示为关闭。
      • 这些糟糕的日期时间类被现代的 java.time 类所取代。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多