检查时间是否在两个值之间-始终返回0

时间:2019-05-19 13:47:39

标签: android time android-calendar datetime-comparison

如果时间在两个值之间,我可以显示警报。

例如:

开始= 07:00:00

end = 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,即使实际时间在开始和结束之间。

为什么有什么主意?

3 个答案:

答案 0 :(得分:2)

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点,则会得到:

  

在之间?真正; a = 1

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

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

我正在利用您的时间字符串采用ISO 8601格式的事实,LocalTime和其他java.time类将其解析(并打印)为默认格式。因此,我们无需显式格式化程序即可进行解析。

您尝试使用的日期时间类DateCalendar早已过时且设计欠佳。同样,整数值70 000和170 000对于开始时间和结束时间的表示没有任何意义。取而代之的是,我使用Java.time(现代Java日期和时间API)中的LocalTime。这是一天中没有日期且没有UTC偏移量的时间,因此似乎正是您所需要的。

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

是的,java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

  • 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
  • 在Java 6和7中,获得了ThreeTen反向端口,这是现代类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接

答案 1 :(得分: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;

答案 2 :(得分:1)

您可以尝试这种方式

    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
    }