【问题标题】:check if the time lies between two other times in 12 hr time span检查时间是否介于 12 小时时间跨度内的其他两个时间之间
【发布时间】:2015-10-21 21:28:07
【问题描述】:

如果我正在检查的时间在我第一次比较之前,我正在尝试的以下代码正在工作。

如果 timeToCompare 是在下午 6 点之后,它的工作状态良好,如果它位于两个时间段之间,它的工作状态良好,但前提是它不在时间范围内但仍处于 if 状态的 01:00:00 AM。

如有错误请指正。

    String string1 = "07:00:00 AM";
    Date time1 = new SimpleDateFormat("HH:mm:ss a").parse(string1);
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(time1);


    String string2 = "06:00:00 PM";
    Date time2;
    time2 = new SimpleDateFormat("HH:mm:ss a").parse(string2);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(time2);
    calendar2.add(Calendar.DATE, 1);

    String timeToCompare = "01:00:00 AM";
    System.out.println(formattedDate);
    Date d = new SimpleDateFormat("HH:mm:ss a").parse(timeToCompare);
    Calendar calendar3 = Calendar.getInstance();
    calendar3.setTime(d);
    calendar3.add(Calendar.DATE, 1);

我的 timeToCompare 但介于 string1 和 string2 之间

    Date x = calendar3.getTime();
    if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) {
        //checkes whether the current time is between 14:49:00 and 20:11:13.
        System.out.println("Hi from time between given slots");
    }

1:00:00 AM 不在这两个时间的中间,但它仍然进入 if 条件,它正在打印“Hi from time between given slots”

【问题讨论】:

  • 你能使用 Joda Time 或 Java 8 的 java.time 包吗?这将使您的生活更加更轻松。如果您能为我们提供一个简短但完整的示例,其中包含示例输入、预期输出和实际输出,也会有所帮助。
  • 这些是导入 java.text.DateFormat;导入 java.text.ParseException;导入 java.text.SimpleDateFormat;导入 java.util.Calendar;导入 java.util.Date;导入 java.util.List;导入 java.util.Locale;
  • 生成一个简短但完整的示例不仅仅是添加导入。我们应该能够复制您的代码,将其粘贴到一个空文本文件中,保存并运行它。现在,您使用的是 Java 6——它已经非常老了,你真的应该尝试更新到 Java 8——但你仍然可以使用 Joda Time。有什么阻止你这样做的吗?
  • 1:00:00 AM tomorrow 肯定在 7:00:00 AM today 和 6:00:00 PM tomorrow 之间
  • 您还应该注意SimpleDateFormat pattern specifiersH(您使用的)和hKk 的区别——H 记录为 一天中的小时 (0-23) 可以让您解析 22:33:44,但您也可以使用 a 这将允许 22:33:44 AM ... 这没有任何意义。如果您需要上午/下午,您应该使用 hKnot H

标签: java date calendar simpledateformat


【解决方案1】:

您正在向字符串 2 和字符串 3 添加一天。在内部,Java 将您的时间存储如下:

> calendar1.getTime()
Thu Jan 01 07:00:00 CST 1970
> calendar2.getTime()
Fri Jan 02 06:00:00 CST 1970
> calendar3.getTime()
Fri Jan 02 01:00:00 CST 1970

所以,你的时间范围比你想象的要大!

【讨论】:

  • 有没有其他方法可以找到解决办法
  • 我不太确定您在寻找什么解决方案。如果您不希望您的 1:00:00 AM 在间隔中进行评估,请删除 calendar2.add(Calendar.DATE, 1)calendar3.add(Calendar.DATE, 1) 行。
  • @tom 你的问题是你的起点和终点比你想象的要远。您的问题标题询问如何查找时间是否在 12 小时跨度内,然后您创建一个 35 小时跨度。
【解决方案2】:

不正确的解析模式

您应该使用小写的hh 来表示小时值 1-12。大写的HH 代表 24 小时制 0-23。

java.time

您应该使用 Java 8 及更高版本中内置的新 java.time 框架。旧的 java.util.Date/.Calendar 和 SimpleDateFormat 类是出了名的麻烦。

新框架包括一个仅用于时间值的类LocalTime。此类没有日期,也没有时区。但请注意如何需要时区来确定当前时间。

String string1 = "07:00:00 AM";
String string2 = "06:00:00 PM";
String string3 = "01:00:00 AM";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "hh:mm:ss a" , Locale.ENGLISH );

LocalTime localTime1 = formatter.parse ( string1 , LocalTime :: from );
LocalTime localTime2 = formatter.parse ( string2 , LocalTime :: from );
LocalTime localTime3 = formatter.parse ( string3 , LocalTime :: from );
LocalTime now = LocalTime.now ( ZoneId.of ( "America/Montreal" ) );

这些 LocalTime 对象具有方便的 isBeforeisAfterisEqual 方法。

Boolean isFirstInputEarlierThanNow = localTime1.isBefore ( now );

LocalTime 类也实现了Comparable 接口。因此,您可以按照此示例代码对它们进行排序。

List<LocalTime> localTimes = Arrays.asList ( localTime1 , localTime2 , localTime3 , now );
Collections.sort ( localTimes );

LocalTime earliest = localTimes.get ( 0 ); // Index, meaning zero-based counting.
LocalTime latest = localTimes.get ( localTimes.size () - 1 ); // Index (zero-based counting), so subtract one.

转储到控制台。

System.out.println ( "localTimes: " + localTimes );
System.out.println ( "isFirstInputEarlierThanNow: " + isFirstInputEarlierThanNow );
System.out.println ( "earliest: " + earliest + " … latest: " + latest );

运行时。

本地时间:[01:00, 07:00, 18:00, 19:26:41.932]

isFirstInputEarlierThanNow: true

最早:01:00 … 最晚:19:26:41.932

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2014-01-09
    相关资源
    最近更新 更多