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

任何想法为什么?

4

3 回答 3

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().

在我的布尔表达式中,我使用“not before”来表示“等于或之后”。

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

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

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

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

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

链接

于 2019-05-20T15:24:37.913 回答
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;
于 2019-05-19T14:16:10.463 回答
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
    }
于 2019-05-19T14:34:43.540 回答