【问题标题】:Get time from date and databse then compare these time in java从日期和数据库中获取时间,然后在 java 中比较这些时间
【发布时间】:2018-09-04 09:54:15
【问题描述】:

我有一个日期: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*
}

【问题讨论】:

  • 如果两个字符串都是HH:mm:ss 格式,它们可以通过StringcompareTo 方法进行比较(如果您确实需要作为文本进行比较)。我更愿意将该字符串转换为LocalTime(左右),然后使用他们的compareTo 进行比较
  • @weaver 我不相信DatecompareTo(String) 方法
  • @CarlosHeuberger 看到这个。 Date 有 compareTo 函数Date javadoc
  • 我建议您避免使用 SimpleDateFormatDateFormat 类。它们不仅与Date 一起已经过时了,而且出了名的麻烦。今天我们在java.time, the modern Java date and time API 的表现要好得多。
  • @drowny 并且根据该文档(以及它的 Java 10 版本),它的论点 不是 String ,是吗?我明确地将其放在我的评论中,timeFromDB,正如@weaver 所建议的那样,恰好是String(问题的一部分)

标签: java database date time compare


【解决方案1】:

这样写;

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

详细说明

  • actDate.after(timeFromDb) 提供大于大小写。
  • actDate.compareTo(timeFromDB)==0 提供 actDatetimeFormDb

如果两者格式相同,则在字符串比较中;

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

【讨论】:

  • 嗨@drowny,我有 2 次格式相同但在字符串中。 String timeFromAct = formatDay.format(actDate); String timeFromDB = Arrays.toString(timeValue); 如果两个时间都在字符串中,这会起作用吗? if (timeFromAct.after(timeFromDb) || actDate.compareTo(timeFromDB)==0 )
  • 如果两者都在字符串中,直接像if(timeFromAct &gt; timeFromDB || timeFromAct .equals(timeFromDB)){..}那样做
  • 我刚试过但出现错误:operator &gt; cannot be applied to java.lang.String,java.lang.String
  • 抱歉更改此 if(timeFromAct.compareTo(timeFromDB) &gt; 0 || timeFromAct .equals(timeFromDB)){..} 。我更新了帖子
  • 你能解释一下 compareTo 部分吗?这是否意味着如果我想要timeFromAct timeFromDB,我可以简单地写(timeFromAct.compareTo(timeFromDB) &lt; 0
【解决方案2】:

来自 java.time 的本地时间

    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,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多