从日期和数据库中获取时间,然后在java中比较这些时间

从日期和数据库中获取时间,然后在java中比较这些时间,java,database,date,time,compare,Java,Database,Date,Time,Compare,我有一个日期:actDate,它的时间被提取为字符串TimeFlomact 然后我从数据库中得到了一个参考时间:timeValue,它被转换为字符串timeFromDB 我知道将两者转换为字符串不会让我比较2次,但是 我想知道如何在类似于下面比较的if语句中比较这些时间值 if (timeFromAct is greater than or equal to timeFromDB){ *some codes* } 这样写 if (actDate.after(timeFromDb) || act

我有一个日期:actDate,它的时间被提取为字符串TimeFlomact

然后我从数据库中得到了一个参考时间:timeValue,它被转换为字符串timeFromDB

我知道将两者转换为字符串不会让我比较2次,但是

我想知道如何在类似于下面比较的if语句中比较这些时间值

if (timeFromAct is greater than or equal to timeFromDB){
*some codes*
}
这样写

if (actDate.after(timeFromDb) || actDate.compareTo(timeFromDB)==0 ){
*some codes*
}
详细地

actDate.aftertimeFromDb提供大于大小写的值。 actDate.compareTotimeFromDB==0提供actDate和 timeFormDb。 或在字符串比较中,如果两者的格式相同

if(timeFromAct.compareTo(timeFromDB) > 0 || timeFromAct .equals(timeFromDB)){..}
还是更简单

if(!(timeFromAct.compareTo(timeFromDB) < 0)){..}
java.time中的LocalTime LocalTime是一天中没有日期和时区的时间。我相信这正是你所需要的

我假设getActDate总是返回一个旧的fashoined日期对象。如果您可以修改它以从java.time(现代java日期和时间API)返回适当的类型,那就更好了

在上述代码中从日期到本地时间的转换中,您需要正确设置时区,否则会得到错误的结果。我暂时假设JVM时区设置,标记为ZoneId.systemDefault,因为您问题中的SimpleDataFormat使用了此设置;但这是脆弱的,因为可以从程序的另一部分或运行在同一JVM中的另一个程序更改设置。如果可以指定正确的时区,例如ZoneId.ofAsia/Manila,则效果更好

一定要检查你的假设。RTManager.getSomethingDecodeList肯定只会返回1个值,如下所示:[23:32:45]。检查的成本很低,如果有一天项目中的新程序员修改它以返回不同长度的数组,那么跟踪错误的成本将很高。在这种情况下,通过发出一条有用的错误消息来提供帮助

您使用的日期-时间类-DateFormat、SimpleDateFormat和date-早已过时且设计拙劣。前两个尤其以麻烦著称。如果你能避免的话,我看不出你有什么理由要使用这些

不幸的是,我无法从我编写代码的地方导入java.time

如果您至少使用Java 6,那么可以使用Java.time

在Java8和更高版本以及API级别26的较新Android设备上,我被告知现代API是内置的。 在Java6和Java7中,获取ThreeTen Backport,JSR310的新类ThreeTen的Backport;请参阅底部的链接。 在较旧的Android上,使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。 链接 解释如何使用java.time。 ,其中首次描述了java.time。 ,java.time的后端口到JSR-310的Java6和Java7。 ,Android版Three Ten Backport ,解释得非常透彻。
如果两个字符串都是HH:mm:ss格式,如果确实需要作为文本进行比较,则可以使用字符串的compareTo方法对它们进行比较。我更愿意将该字符串转换为LocalTime左右,然后使用它们的字符串进行比较compareTo@weaver我不相信那个日期有比较字符串method@CarlosHeuberger看这个。Date具有compareTo函数,我建议您避免使用SimpleDateFormat和DateFormat类。它们不仅与日期一起过时很久,而且还出了名的麻烦。今天,我们在@crowey和该文档以及Java10版本中有了更好的理解,它的参数不是字符串,是吗?我明确地把它放在我的评论和timeFromDB中,正如@weaver所建议的,恰好是问题的一个字符串部分。hi@crowey,我有两次使用相同的格式,但都是字符串。字符串TimeFinder=formatDay.formatactDate;字符串timeFromDB=Arrays.toStringtimeValue;如果这两个时间都在字符串中,这会起作用吗?如果TimeFinder.aftertimeFromDb | | | actDate.compareTotimeFromDB==0如果两者都在字符串中,请直接像iftimeFromAct>TimeFinder | | | timeFromAct.equalstimeFromDB{..}一样执行此操作。我刚刚尝试过,但出现错误:运算符>无法应用于java.lang.string,java.lang.Strings可能会使用此iftimeFromAct.compareTotimeFromDB>0 | | | timeFromAct.equalstimeFromDB{..}进行更改。我更新了邮件,你能解释一下比较部分吗?这是否意味着如果我想要timefromctif(!(timeFromAct.compareTo(timeFromDB) < 0)){..}
"a".compareTo("b"); // returns a negative number, here -1
"a".compareTo("a"); // returns  0
"b".compareTo("a"); // returns a positive number, here 1
    Date actDate = actinfo.getActDate();
    ResultTable[] timeValue = RTManager.getSomethingDecodeList(date);

    LocalTime actualTime = actDate.toInstant()
            .atZone(ZoneId.systemDefault())
            .toLocalTime();
    if (timeValue.length == 1) {
        LocalTime timeFromDB = LocalTime.parse(timeValue[0].toString());
        if (! actualTime.isBefore(timeFromDB)) {
            System.out.println("timeFromAct is greater than or equal to timeFromDB");
        } else {
            System.out.println("timeFromAct is less than timeFromDB");
        }
    } else {
        System.out.println("Unexpected number of ResultTable entries: " + timeValue.length);
    }