Java 不';不要在上午10点之前比较时间
我在循环中进行时间比较。因此,它会检查以Java 不';不要在上午10点之前比较时间,java,date,parsing,time,localtime,Java,Date,Parsing,Time,Localtime,我在循环中进行时间比较。因此,它会检查以HH:mm格式保存的所有时间,然后执行其他指令。 如果我尝试比较00:00和09:59之间的时间,它会给出错误。 我能做什么 for(int contatore = 0; lista_allarmi.moveToNext() ; contatore++) { Date ORANOTIFICA; ID_M = lista_allarmi.getInt(0); NOME_M = lista_allarmi.getString(1);
HH:mm
格式保存的所有时间,然后执行其他指令。如果我尝试比较
00:00
和09:59
之间的时间,它会给出错误。
我能做什么
for(int contatore = 0; lista_allarmi.moveToNext() ; contatore++) {
Date ORANOTIFICA;
ID_M = lista_allarmi.getInt(0);
NOME_M = lista_allarmi.getString(1);
TIPO_M = lista_allarmi.getString(2);
String ora_notifica = lista_allarmi.getString(3);
parts = ora_notifica.split(":");
hrs = Integer.parseInt(parts[0]); // ore
min = Integer.parseInt(parts[1]); // minuti
ora_allm.set(Calendar.HOUR_OF_DAY,hrs);
ora_allm.set(Calendar.MINUTE, min);
ora_allm.set(Calendar.SECOND, 0);
ora_allm_piut = ora_allm;
ora_allm_piut.add(Calendar.MINUTE, 5);
hrs = ora_allm_piut.get(Calendar.HOUR_OF_DAY);
min = ora_allm_piut.get(Calendar.MINUTE);
HPT = String.valueOf(hrs);
MPT = String.valueOf(min);
ORARNPT = HPT + ":" + MPT; ORANOTIFICAPIUTIMER;
Date ora_attuale = Calendar.getInstance().getTime();
Date ORARIOATT;
i = new Intent(getContext(), AlarmReceiver.class);
i.putExtra("id", ID_M);
i.putExtra("NMM", NOME_M);
i.putExtra("TPM", TIPO_M);
pi = PendingIntent.getBroadcast(getContext(), contatore, i, PendingIntent.FLAG_UPDATE_CURRENT);
if(LocalTime.now().isAfter(parse(ora_notifica)) && LocalTime.now().isBefore(parse(ORARNPT))) {
//A
} else {
//B
}
}
tl;博士
您使用了错误的类
永远不要使用与Java最早版本捆绑在一起的非常麻烦的旧日期时间类。现在这些都是遗留的,完全被java 8和更高版本中内置的java.time类所取代。同时避免使用日期、日历和简化格式
格式必须与输入匹配
HH:mm格式
java.time.format.DateTimeParseException:无法在索引0处分析文本“9:25”
您的格式模式显示HH
,表示两位数的值。对于1-9小时,预期前导填充为零。您输入的9:25
缺少填充零
对于此类输入,请使用单个H
。而且可能分钟数没有填充零,因此在那里也使用一个m
模式的日期时间格式(“H:m”)
不要那么努力工作
time类将为您解析字符串输入。不需要自己分析文本
DateTimeFormatter f = DateTimeFormatter.ofPattern( "H:m" ) ;
LocalTime lt = LocalTime.parse( "9:25" , f ) ;
半开
比较00:00和09:59之间的时间
在定义时间跨度时,半开放式方法通常是最好的。在这种方法中,开始被认为是包含的,而结束是独占的。这意味着上午9点的时间从09:00开始,一直到但不包括下一小时的第一刻10:00
“半开放”的一个好处是,你可以避免在一个小时内的最后一刻试图将其一分为二。最后一刻是09:59吗?09:59.9? 09:59.999999999? 通过询问“上午10点之前的时刻是不是?”来避免整个崩溃
仅限一天中的某个时间,没有日期的上下文,时钟会在午夜停止。因此,如果你想问一天中的某个时间是否在午夜到上午10点之间,你只需要问它是否在上午10点之前
LocalTime stop = LocalTime.of( 10 , 0 );
LocalTime x = LocalTime.parse( "09:25" ) ;
Boolean isEarlyEnough = x.isBefore( stop ) ;
也许您希望使用一天中第一个时刻以外的开始时间。在这种情况下,请指定开始和停止
LocalTime start = LocalTime.MIN ; // Constant for 00:00:00.000000000.
LocalTime stop = LocalTime.of( 10 , 0 );
LocalTime x = LocalTime.parse( "09:25" ) ;
Boolean isEarlyEnoughButNotTooEarly = ( ! x.isBefore( start ) ) && x.isBefore( stop ) ; // "Not before" is a briefer way of saying "Is equal to or later than".
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
classes
从哪里获得java.time类
- 然后
- 内置的
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(当Calendar.hour\u OF_DAY的小时数为时,我忘了添加一个“0”,你能显示什么
是吗?感谢您发布一些代码,但这还不足以让人们快速发现错误,而且您也没有包括您收到的错误。如果是异常,请包括完整的堆栈跟踪。对于代码,请创建一个堆栈跟踪,并将其发布到此处。您是否尝试调试代码?解析(ora\u notifica)
在lista_Allari.moveToNext()
循环中似乎是一个非常奇怪的限制。在您的最后一条评论中,您引用了java.time类解析中的一个错误,但我在上面的源代码中没有看到java.time解析。在发布堆栈溢出之前,请更加小心地进行彻底和良好的编写。并花时间编写简短的人工示例代码而不是剪切和粘贴您的实时代码。for
LocalTime start = LocalTime.MIN ; // Constant for 00:00:00.000000000. LocalTime stop = LocalTime.of( 10 , 0 ); LocalTime x = LocalTime.parse( "09:25" ) ; Boolean isEarlyEnoughButNotTooEarly = ( ! x.isBefore( start ) ) && x.isBefore( stop ) ; // "Not before" is a briefer way of saying "Is equal to or later than".
hrs=ora_allm_piut.get(Calendar.HOUR_OF_DAY); min=ora_allm_piut.get(Calendar.MINUTE); if(hrs<=9){HPT=String.valueOf("0"+hrs);