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

时间:2018-09-04 09:54:16

标签: java database date time compare

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

然后我有一个来自数据库的参考时间: timeValue ,该时间已转换为字符串,作为 timeFromDB

DateFormat formatTime;
formatTime = new SimpleDateFormat("HH:mm:ss");  
Date actDate = actinfo.getActDate();
String timeFromAct = formatDay.format(actDate);

String date= ListOfConstants.SOME_DATE_REF;
ResultTable[] timeValue = RTManager.getSomethingDecodeList(date);
String timeFromDB = Arrays.toString(timeValue);

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

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

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

2 个答案:

答案 0 :(得分:1)

这样写;

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

详细信息

  • actDate.after(timeFromDb)所提供的功能远非案例。
  • actDate.compareTo(timeFromDB)==0提供了actDatetimeFormDb

或者如果两者的格式相同,则使用String比较;

if(timeFromAct.compareTo(timeFromDB) > 0 || timeFromAct .equals(timeFromDB)){..}

或更简单

if(!(timeFromAct.compareTo(timeFromDB) < 0)){..}

String.compareTo用作

"a".compareTo("b"); // returns a negative number, here -1
"a".compareTo("a"); // returns  0
"b".compareTo("a"); // returns a positive number, here 1

答案 1 :(得分:1)

java.time中的LocalTime

    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);
    }

LocalTime是一天中没有日期和时区的时间。我相信这正是您所需要的。

我假设getActDate总是返回旧的Date对象。最好将其修改为从现代Java日期和时间API java.time返回合适的类型。

在上述代码中从DateLocalTime的转换中,您需要正确设置时区,否则将得到错误的结果。我暂时假定JVM时区设置为ZoneId.systemDefault(),因为您问题中的SimpleDateFormat使用了此设置;但这是脆弱的,因为可以从程序的另一部分或在同一JVM中运行的另一个程序更改设置。如果您可以指定正确的时区,例如ZoneId.of("Asia/Manila"),则更好。

请检查您的假设。 RTManager.getSomethingDecodeList当然只会返回1个值,例如:[23:32:45]。这项检查花费很少,如果某天项目上的新程序员修改它以返回不同长度的数组,则跟踪该错误将很昂贵。在这种情况下,通过发出有用的错误消息来提供帮助。

您使用的日期时间类-DateFormatSimpleDateFormatDate-早已过时且设计欠佳。前两个特别以麻烦而闻名。我认为没有任何理由可以避免使用这些方法。

  

不幸的是,我无法从执行代码的地方导入java.time。

如果您至少使用Java 6,则可以使用java.time。

  • 在Java 8和更高版本以及较新的Android设备上(我被告知,从API级别26开始),内置了现代API。
  • 在Java 6和7中,获得ThreeTen Backport,即新类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接