Android Java, если время между двумя ошибками - PullRequest
0 голосов
/ 22 ноября 2018

Я использую файл JSON для хранения нескольких записей для конференции.Я пытаюсь получить текущее событие при использовании date.before и date.after в объекте Calendar в Java.Мой текущий код возвращает три разных события, и я понятия не имею, мне интересно, есть ли у кого-нибудь какие-либо предложения, которые я попробовал почти во всем.Я приложу JSON и код ниже.Я также приложу то, что код помещает в окно консоли.

Журнал консоли

11-22 15:54:12.883 5797-5797/reloaded D/timetest:
    add event with name:Coffee Break
    time start: Tue Nov 22 15:30:00 GMT+00:00 18
    time end: Wed Nov 23 16:30:00 GMT+00:00 18
    time now: Wed Nov 23 15:45:00 GMT+00:00 18
11-22 15:54:12.885 5797-5797/reloaded D/timetest:
    add event with name:Panel Discussion
    time start: Tue Nov 22 16:30:00 GMT+00:00 18
    time end: Wed Nov 23 17:15:00 GMT+00:00 18
    time now: Wed Nov 23 15:45:00 GMT+00:00 18
11-22 15:54:12.888 5797-5797/reloaded D/timetest:
    add event with name:Turning Information into an Engaging Experience – The Design of Media Spaces
    time start: Tue Nov 22 17:15:00 GMT+00:00 18
    time end: Wed Nov 23 18:00:00 GMT+00:00 18
    time now: Wed Nov 23 15:45:00 GMT+00:00 18

JSON

{
      "eventid": "11",
      "roomid": "9",
      "type": "other",
      "name": "Coffee Break",
      "timestart": "15:30",
      "timeend": "16:30",
      "day": "1",
      "text": "Discover the Future Forum",
      "pic": "coffeecup.png",
      "speakerid": "1",
      "speaker": ""
    },
    {
      "eventid": "12",
      "roomid": "9",
      "type": "other",
      "name": "Panel Discussion",
      "timestart": "16:30",
      "timeend": "17:15",
      "day": "1",
      "text": "",
      "pic": "welcometalk.png",
      "speakerid": "1",
      "speaker": "fudged"
    },
    {
      "eventid": "13",
      "roomid": "9",
      "type": "lecture",
      "name": "Turning Information into an Engaging Experience – The Design of Media Spaces",
      "timestart": "17:15",
      "timeend": "18:00",
      "day": "1",
      "text": "fdsfsd",
      "pic": "p4.jpg",
      "speakerid": "6",
      "speaker": "test"
    },

Java

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);

    String string2 = "22/11/18 " + c.getString("timeend");
    Date time2 = new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(string2);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(time2);
    calendar2.add(Calendar.DATE, 1);

    String someRandomTime = "22/11/18 15:45";
    Date d = new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(someRandomTime);
    Calendar calendar3 = Calendar.getInstance();
    calendar3.setTime(d);
    calendar3.add(Calendar.DATE, 1);

    Date now = calendar3.getTime();

    Date timestart = calendar1.getTime();
    Date timeend = calendar2.getTime();

    if ((now.after(timestart)) && (now.before(timeend))) {
        Log.d("timetest","add event with name:"+c.getString("name") + " time start: " + timestart+ " time end " + timeend + " time now " + now);
    }
}
catch (ParseException e) {
    e.printStackTrace();
}

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вы должны использовать новый Java Date & Time 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 класс.

0 голосов
/ 23 ноября 2018

Как я уже упоминал в разделе комментариев:

Вы можете преобразовать время в миллисекунду , а затем проверить, больше ли текущее время, чем время начала события.Если это так, вы вернете данные.


Например:

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();
}

Важное замечание:

Iтакже предложил бы хранить дату и время события в миллисекундах в вашей базе данных вместо жесткого кодирования.В своем ответе я сделал это так, как вы сделали для демонстрационных целей.

Если вы храните время начала и время окончания в миллисекундах, вы сможете определить время, оставшееся до начала события, например this .

...