Android Java如果时间介于两次错误之间

Android Java如果时间介于两次错误之间,java,android,simpledateformat,android-calendar,Java,Android,Simpledateformat,Android Calendar,我使用一个JSON文件来存储会议的多个条目。我试图在Java中的日历对象中使用date.before和date.after获取当前事件。我当前的代码返回三个不同的事件,我不知道,我想知道是否有人对我尝试过的所有事情都有任何建议。我将在下面附上JSON和代码。我还将把代码放入控制台窗口 控制台日志 11-22 15:54:12.883 5797-5797/重新加载D/时间测试: 添加名为“咖啡休息”的活动 时间开始:11月22日星期二15:30:00 GMT+00:00 18 时间结束:11月23

我使用一个JSON文件来存储会议的多个条目。我试图在Java中的日历对象中使用date.before和date.after获取当前事件。我当前的代码返回三个不同的事件,我不知道,我想知道是否有人对我尝试过的所有事情都有任何建议。我将在下面附上JSON和代码。我还将把代码放入控制台窗口

控制台日志

11-22 15:54:12.883 5797-5797/重新加载D/时间测试:
添加名为“咖啡休息”的活动
时间开始:11月22日星期二15:30:00 GMT+00:00 18
时间结束:11月23日星期三16:30:00 GMT+00:00 18
现在时间:11月23日星期三15:45:00 GMT+00:00 18
11-22 15:54:12.885 5797-5797/重新加载D/时间测试:
添加名为“小组讨论”的事件
时间开始:11月22日星期二16:30:00 GMT+00:00 18
时间结束:11月23日星期三17:15:00 GMT+00:00 18
现在时间:11月23日星期三15:45:00 GMT+00:00 18
11-22 15:54:12.888 5797-5797/重新加载D/时间测试:
添加活动名称:将信息转化为引人入胜的体验–媒体空间的设计
时间开始:11月22日星期二17:15:00 GMT+00:00 18
时间结束:11月23日星期三18:00:00 GMT+00:00 18
现在时间:11月23日星期三15:45:00 GMT+00:00 18
JSON

爪哇


正如我在评论部分提到的:

您可以将时间转换为毫秒,然后检查当前时间是否大于事件的开始时间。如果是,您将返回数据


像这样:

try {
    String string1 = "22/11/18 " + c.getString("timestart");
    Date time1 = new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(string1);
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(time1);

    //Convert event time to milliseconds
    int timestart = calendar1.get(Calendar.MILLISECOND);

    //Get current time in milliseconds
    Calendar calendarCurrent = Calendar.getInstance();
    calendarCurrent.setTime(new Date());
    int now = calendar.get(Calendar.MILLISECOND);


    //Check if the event time is greater then the current time
    if (timestart > now) {
        Log.d("timetest - ",+"Event "+c.getString("name")+" already started");
    }else{
        Log.d("timetest - ",+"Event "+c.getString("name")+" has not started yet");
    }
 } catch (ParseException e) {
     e.printStackTrace();
}

需要注意的重要事项:

我还建议在数据库中以毫秒为单位存储事件的日期和时间,而不是硬编码。在我的回答中,我像你那样做是为了演示


如果将开始时间和结束时间存储为毫秒,则可以确定事件开始前的剩余时间,例如。

您应该使用新的Java日期和时间API,该API在
Java.time
包中提供。
旧的
Date
Calendar
类已经过时

如果您只处理时间,那么可以使用
LocalTime
类查看某个时间是否介于其他两个时间之间:

// First, parse the times
DateTimeFormatter f = DateTimeFormatter.ofPattern("HH:mm");
LocalTime startTime = LocalTime.parse(c.getString("timestart"), f);
LocalTime endTime = LocalTime.parse(c.getString("timeend"), f);

// Then check if now is between those two times
LocalTime now = LocalTime.now();
if (now.isAfter(startTime) && now.isBefore(endTime)) {
    ...
}
或者,如果事件尚未启动,则告诉人们事件将在何时启动:

if (now.isBefore(startTime)) {
    Duration d = Duration.between(now, startTime);
    System.out.println("Event starting in about " + d);
}
else if (now.isBefore(endTime)) {
    System.out.println("Event is now going on");
}
else {
    System.out.println("Event has passed");
}


注:我假设事件不会在指定的时间每天重复,所以你可以考虑不只是存储时间,也可以存储日期。您可以将时间戳存储为整数,但是像
2018-11-23T11:57:03+01:00
这样的格式也被广泛使用。然后,您可以使用
DateTimeFormatter
类轻松解析它们。

1。尝试记录日历对象以查看时间是否正确解析。2.您也可以直接比较日历对象,而不是转换为日期。我做了一些日志,并附加了@viv。您到底想做什么?您不应该再使用
date
calendar
类。使用它们很麻烦。改用新的Java日期和时间API。如果由于Android版本的原因,您无法使用Three-Ten Backport。这可能不是OP目前编写的此类代码的最大问题,但如果您打算构建更大一点的应用程序,它可能会节省您的时间。我试过这个代码,但它不起作用。当我记录控制台日志时,它说开始是0?这不就是让已经很复杂的事情变得更复杂吗?@OleV.V。我认为它一点也不复杂?你可以与另一个答案相比,用9行而不是20行来完成同样的任务。我还发现这9行字读起来更清晰。这个答案根本不起作用。
Calendar.millissecond
字段返回秒内的毫秒数,其范围始终在0到999之间。@CurtisB请参见编辑:simply with
LocalTime now=LocalTime.now()
。我建议将时区传递给
LocalTme.now
,这样即使只传递
ZoneId.systemDefault()
。由于来自JSON的时间(如
15:30
)符合ISO 8601格式,因此如果不愿意,不需要指定解析时间的显式格式设置程序。这是一个很好的答案,可以演示使用java.time的工作是多么简单。
// First, parse the times
DateTimeFormatter f = DateTimeFormatter.ofPattern("HH:mm");
LocalTime startTime = LocalTime.parse(c.getString("timestart"), f);
LocalTime endTime = LocalTime.parse(c.getString("timeend"), f);

// Then check if now is between those two times
LocalTime now = LocalTime.now();
if (now.isAfter(startTime) && now.isBefore(endTime)) {
    ...
}
if (now.isBefore(startTime)) {
    Duration d = Duration.between(now, startTime);
    System.out.println("Event starting in about " + d);
}
else if (now.isBefore(endTime)) {
    System.out.println("Event is now going on");
}
else {
    System.out.println("Event has passed");
}