【问题标题】:How to Compare sysdate time and String time in Java如何在 Java 中比较 sysdate 时间和 String 时间
【发布时间】:2016-09-21 09:22:19
【问题描述】:

我想做的是:

  • 如果时间是10:00:00 proc.process将被执行
  • 如果时间是 11:00:00 proc.process1 将被执行

String TimeVal = "11:00:00";
String TimeVal1 = "12:00:00";

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm:ss");
Date date1 = sdf.parse(TimeVal);
Date date2 = sdf2.parse(TimeVal1);

if (date1 == date) {
    proc.process(variable);    
}
if (date1 == date) {
    proc.process1(variable);     

    proc.process2(variable);
    proc.process3(variable);
    proc.process4(variable);
    proc.process5(variable);
    proc.process6(variable);
    proc.process7(variable);
    proc.process8(variable);
    proc.process9(variable);
    proc.process10(variable);
    proc.process11(variable);

【问题讨论】:

  • 为什么不用java 8方式?
  • 首先要了解:== 告诉您两个引用是否指向相同对象。当你解析两个字符串时,你会得到 两个 日期对象;所以你的支票总是是假的。您必须改用 equals() 。说真的:如果你在这些超级基础上失败了,那么你应该退后一步,忘记你现在尝试做的事情。因为那时你几乎一无所知;你最好花几个星期来学习那些基础知识。否则,你只会从一个令人沮丧的时刻跑到下一个。因为你尝试什么都没有会奏效。
  • 你有什么建议我学习 GhostCat 需要什么基础
  • OCA Java Book 学习

标签: java methods time simpledateformat sysdate


【解决方案1】:

tl;博士

LocalTime now = LocalTime.now( ZoneId.of( "America/Montreal" ) );
Boolean isNowWithinRange =
    ( 
        ( ! now.isBefore( LocalTime.parse( "11:00:00" ) ) ) 
        && now.isBefore( LocalTime.parse( "12:00:00" ) 
    ) ;

详情

accepted answer 是一个很好的尝试,但有多个缺陷。

拨打now 两次是不好的做法,因为您最终会与两个不同的时刻进行无效比较。调用一次,然后赋值给一个变量。

不要忽视时区的关键问题。最好将可选时区参数显式传递给 now( ZoneId ),而不是隐式依赖 JVM 的当前默认值,该默认值可以随时更改。

您可以询问设备当前的默认时区。但如果至关重要,您应该向用户询问/确认。

ZoneId z = ZoneId.of( "America/Montreal" ); 
LocalTime now = LocalTime.now( z );

您可以将输入字符串直接解析为LocalTime 对象。

LocalTime start = LocalTime.parse( "11:00:00" );
LocalTime stop = LocalTime.parse( "12:00:00" );

日期时间工作中的常见做法是对时间跨度使用半开方法。开头是inclusive,而结尾是exclusive。始终如一地使用这种方法可以使您的代码更易于理解且不易出错。

提示:说“not before start”是“等于或晚于 start”的一种更简洁的说法。

Boolean isNowWithinRange = ( ( ! now.isBefore( start ) ) && now.isBefore( stop ) ) ;

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,例如 java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time 项目现在位于 maintenance mode,建议迁移到 java.time。

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

大部分 java.time 功能在ThreeTen-Backport 中向后移植到Java 6 和7,并进一步适应ThreeTenABP 中的Android(参见How to use…)。

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

【讨论】:

    【解决方案2】:

    如果你想坚持你的 Date() 对象,你可以比较millis:

    if(date1.getTime() == date.getTime()) { 
    // ...
    }
    

    【讨论】:

      【解决方案3】:

      你为什么不简单地使用 java 8 date api?

      喜欢:

       LocalTime firstTime = LocalTime.of(11, 0, 0); 
       LocalTime secondTime = LocalTime.of(12, 0, 0);
       LocalTime now = LocalTime.now();
      
       if (now.isAfter(startTime) &&
           now.isBefore(endTime)){
           //process
       }
      

      【讨论】:

      • 已更正,我无法检查,因为我当前的计算机上没有 java 8
      • 对于半开放式方法,开始是包容性而结束是排斥性的,比较将是:( ! now.isBefore( startTime ) ) && now.isBefore( endTime )
      猜你喜欢
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多