检查时间是否在两个值之间 - 总是 return 0

Check if time is between two values - always return 0

我有一个功能可以在时间介于两个值之间时显示警报。

例如:

开始 = 07:00:00

结束=17:00:00

assert start != null;
                        int from = Integer.valueOf(start.replace(":", ""));
                        assert end != null;
                        int to = Integer.valueOf(end.replace(":", ""));
                        Date date = new Date();
                        Calendar c = Calendar.getInstance();
                        c.setTime(date);
                        int t = c.get(Calendar.HOUR_OF_DAY) * 100 + c.get(Calendar.MINUTE);
                        boolean isBetween = to > from && t >= from && t <= to || to < from && (t >= from || t <= to);
                        a = isBetween ? 1 : 0;

                        if(a == 1) { 
                           alert_f();
                           // a is never 1...
                        }

问题是 a 永远不会是 1,即使实际时间介于开始和结束之间。

有什么想法吗?

嗯,你可以利用 SimpleDateFormat 获取时间,然后将其简化为:

assert start != null;
int from = Integer.valueOf(start.replace(":", ""));
assert end != null;
int to = Integer.valueOf(end.replace(":", ""));
// here the change
int currentTime = Integer.valueOf(new SimpleDateFormat("HH:mm:ss").format(new Date()).replace(":", ""));
boolean isBetween = to > from && currentTime >= from && currentTime <= to || to < from && (currentTime >= from || currentTime <= to);
// end
int a = isBetween ? 1 : 0;

你可以这样试试

    try {
        SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        Date from = parser.parse("2019-12-31 07:00");
        Date to = parser.parse("2019-12-21 17:00");
        int a;
        Date userDate = parser.parse(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()));
        if (userDate.after(from) && userDate.before(to)) 
            a = 1;
         else
            a = 0;
    } catch (ParseException e) {
        // Invalid date was entered
    }

java.time 和 ThreeTenABP

    String start = "07:00:00";
    String end = "17:00:00";
    LocalTime startTime = LocalTime.parse(start);
    LocalTime endTime = LocalTime.parse(end);

    LocalTime now = LocalTime.now(ZoneId.of("Europe/Rome"));

    boolean isBetween = ! now.isBefore(startTime) && now.isBefore(endTime);
    int a = isBetween ? 1 : 0;
    System.out.println("Is between? " + isBetween + "; a = " + a);

当我 运行 刚刚(罗马时间 17:15)时,我得到了 0 和你一样,这是意料之中的。如果我指定一个还不到下午 5 点的时区,我会得到:

Is between? true; a = 1

因此您需要为代码选择正确的时区。如果您信任设备时区,您可以使用 ZoneId.systemDefault().

在我的布尔表达式中,我使用“不早于”来表示“等于或晚于”。

我正在利用这样一个事实,即您的时间字符串采用 ISO 8601 格式,LocalTime 和其他 java.time 类 将这种格式解析(并打印)为它们的默认格式。所以我们不需要明确的格式化程序来进行解析。

您尝试使用的 date-time 类 DateCalendar 早已过时且设计不佳。此外,整数值 70 000 和 170 000 并不能真正代表您的开始和结束时间。相反,我使用 java.time 中的 LocalTime,现代 Java 日期和时间 API。这是一天中没有日期和 UTC 偏移量的时间,所以这似乎正是您在这里需要的。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)现代 API 出现 built-in.
  • 在 Java 6 和 7 中获取现代 类 的 ThreeTen Backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接