我正在循环进行时间比较。因此它会检查所有以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
}
}
答案 0 :(得分:2)
LocalTime.parse(
"9:25" ,
DateTimeFormatter.ofPattern( "H:m" )
)
.isBefore(
LocalTime.of( 10 , 0 )
)
永远不要使用与最早的Java版本捆绑在一起的非常麻烦的旧日期时间类。这些现在已成为遗留物,完全由Java 8及更高版本中内置的 java.time 类取代。完全避免使用Date
,Calendar
和SimpleDateFormat
。
HH:mm格式
...
java.time.format.DateTimeParseException:无法在索引0处解析文本“ 9:25”
您的格式化模式显示HH
,表示两位数字。对于1-9个小时,预期填充为零。您输入的9:25
缺少其填充零。
对于此类输入,请使用单个H
。可能分钟没有填充零,因此也要在其中使用单个m
。
DateTimeFormatter.ofPattern(“ H:m”)
java.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框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:0)
当Calendar.HOUR_OF_DAY花费的时间为<= 9时,我忘记添加“ 0”:
hrs=ora_allm_piut.get(Calendar.HOUR_OF_DAY);
min=ora_allm_piut.get(Calendar.MINUTE);
if(hrs<=9){HPT=String.valueOf("0"+hrs);
现在时间尊重时间格式,我可以进行比较。