【问题标题】:Doesn't compare time before 10 am不比较上午 10 点之前的时间
【发布时间】:2018-12-07 11:23:27
【问题描述】:

我正在循环进行时间比较。所以它会检查我以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
    }
}

【问题讨论】:

  • 你能展示一下parse(ora_notifica)的作用吗?
  • 感谢您发布 一些 代码,但这不足以让人们快速发现错误,而且您也没有包含您收到的错误。如果是异常,请包含完整的堆栈跟踪。对于代码,创建一个minimal, complete and verifiable example 并在此处发布。
  • 你试过调试你的代码吗?
  • lista_allarmi.moveToNext()for 循环中看起来像是一个非常奇怪的限制。
  • 在您的最后一条评论中,您引用了 java.time 类中的解析错误,但我在您的源代码中没有看到 java.time 解析上面的代码。在 Stack Overflow 上发帖之前,请多加注意,写得彻底,写得好。花时间编写简短的人为示例代码,而不是剪切和粘贴您的实时代码。

标签: java date parsing time localtime


【解决方案1】:

tl;博士

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 之间的时间,

在定义时间跨度时,半开放式方法通常是最好的。在这种方法中,开始被认为是inclusive,而结束是exclusive。这意味着上午 9 点的时间从 09:00 开始,一直持续到但不包括下一小时的第一个时刻 10:00。

Half-Open 的一个好处是您可以避免试图确定一个小时的最后时刻。最后一刻是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-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案2】:

    当 Calendar.HOUR_OF_DAY 的小时数为

    hrs=ora_allm_piut.get(Calendar.HOUR_OF_DAY);
    min=ora_allm_piut.get(Calendar.MINUTE);
    if(hrs<=9){HPT=String.valueOf("0"+hrs);
    

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

    【讨论】:

      猜你喜欢
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 2022-08-13
      • 1970-01-01
      • 2013-11-27
      相关资源
      最近更新 更多