【问题标题】:Comparing hours in java比较java中的时间
【发布时间】:2012-04-10 09:18:47
【问题描述】:

首先原谅我的英语:-(

我对 java 的小时数有疑问。我们来看一个例子:

DateFormat datos = new SimpleDateFormat ("hh:mm:ss");
        Date ac, lim;
        String actual,limit;
        actual="18:01:23";
        limit="00:16:23";

        ac=datos.parse(actual);
        lim=datos.parse(limit);


        if(ac.compareTo(lim)==-1){.......

我需要解决这个限制超过午夜而实际时间在午夜之前的情况。我的程序说实际已经达到限制,这是不正确的,因为在示例中,它还有 6 个小时才能完成。

我试图用 DateFormat 类解决它,但它没有看到这种情况。我也尝试过使用 Time 类,但它的方法已被弃用。

我该如何解决这个问题?

【问题讨论】:

  • 如果你不指定一天,那么实际被认为是在限制之后是正常的......实现你想要的唯一方法是指定限制是实际之后的一天(默认情况下日期会认为是同一天)
  • 好的....所以我将更改它并使用 Date 类。如果它通过小时数 23 到 0,我将在计算时间限制时添加 1 天。所以它是正确的。谢谢

标签: java time date-format hour


【解决方案1】:

在您的SimpleDateFormat 中使用HH 而不是hh

DateFormat datos = new SimpleDateFormat("HH:mm:ss");

hh 是 12 小时制(小时从 1 到 12)。

HH 是 24 小时制(小时从 0 到 23)。

但除此之外,还有其他问题。 Date 类不太适合只包含时间。如果执行此操作,它将在指定时间解析为 01-01-1970。所以 18:01:23 变成 01-01-1970, 18:01:23 和 00:16:23 变成 01-01-1970, 00:16:23。您可能想将 18:01:23 与第二天的 00:16:23 进行比较。

试试这样的:

String actual = "18:01:23";
String limit = "00:16:23";

String[] parts = actual.split(":");
Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.HOUR_OF_DAY, Integer.parseInt(parts[0]));
cal1.set(Calendar.MINUTE, Integer.parseInt(parts[1]));
cal1.set(Calendar.SECOND, Integer.parseInt(parts[2]));

parts = limit.split(":");
Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.HOUR_OF_DAY, Integer.parseInt(parts[0]));
cal2.set(Calendar.MINUTE, Integer.parseInt(parts[1]));
cal2.set(Calendar.SECOND, Integer.parseInt(parts[2]));

// Add 1 day because you mean 00:16:23 the next day
cal2.add(Calendar.DATE, 1);

if (cal1.before(cal2)) {
    System.out.println("Not yet at the limit");
}

Joda Time 是一个流行的Java 日期和时间库,其设计比标准Java 日期和日历API 更好;如果您必须在 Java 中处理日期和时间,请考虑使用它。

使用 Joda Time,您可以这样做:

String actual = "18:01:23";
String limit = "00:16:23";

DateTimeFormatter df = DateTimeFormat.forPattern("HH:mm:ss");

DateTime ac = df.parseLocalTime(actual).toDateTimeToday();
DateTime lim = df.parseLocalTime(limit).toDateTimeToday().plusDays(1);

if (ac.isBefore(lim)) {
    System.out.println("Not yet at the limit");
}

【讨论】:

    【解决方案2】:

    作为一种快速而肮脏的解决方案:

      final DateFormat datos = new SimpleDateFormat("HH:mm:ss");
        Date ac;
        final Date lim = new Date();
        String actual, limit;
        actual = "18:01:23";
        limit = "00:16:23";
    
        try {
            ac = datos.parse(actual);
            lim.setTime(ac.getTime() + TimeUnit.MINUTES.toMillis(16) + TimeUnit.SECONDS.toMillis(23));
            if ( ac.before(lim) ) {
                // TODO
            }
        } catch ( final ParseException e ) {
            e.printStackTrace();
        }
    

    【讨论】:

      猜你喜欢
      • 2019-10-28
      • 2015-09-22
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多