Android Java如果时间介于两次错误之间
我使用一个JSON文件来存储会议的多个条目。我试图在Java中的日历对象中使用date.before和date.after获取当前事件。我当前的代码返回三个不同的事件,我不知道,我想知道是否有人对我尝试过的所有事情都有任何建议。我将在下面附上JSON和代码。我还将把代码放入控制台窗口 控制台日志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
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 withLocalTime 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");
}