不比较上午10点之前的时间

时间:2018-06-28 11:31:16

标签: java date parsing time localtime

我正在循环进行时间比较。因此它会检查所有以HH:mm格式保存的时间,然后执行其他说明。
如果我尝试比较介于00:0009: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
    }
}

2 个答案:

答案 0 :(得分:2)

tl; dr

LocalTime.parse(
    "9:25" ,
    DateTimeFormatter.ofPattern( "H:m" )
)
.isBefore(
    LocalTime.of( 10 , 0 ) 
)

您使用了错误的类

永远不要使用与最早的Java版本捆绑在一起的非常麻烦的旧日期时间类。这些现在已成为遗留物,完全由Java 8及更高版本中内置的 java.time 类取代。完全避免使用DateCalendarSimpleDateFormat

格式必须与输入匹配

  

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.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

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

现在时间尊重时间格式,我可以进行比较。