需要比较日期对象而不是秒

时间:2018-05-31 04:30:36

标签: java

我在数据库中使用了两个日期时间对象。我需要在没有秒的情况下进行比较。

日期1值:2018-05-25T13:55:24.000 + 05:30 日期2值:2018-05-31T08:31:00.000 + 05:30

我需要检查日期1是否在日期2之后。

if(Checks.checkNotNull(dateTime) && (partiallyInvalidateDate.isAfter(dateTime))){
    code = null;
  }

但我需要在没有第二部分的情况下进行上述比较。需要一些专家帮助才能做到。

4 个答案:

答案 0 :(得分:2)

假设您将java.sql.ResultSet的日期时间设为java.sql.Timestamp,您可以直接在这些对象上设置秒数和纳米数,然后与after进行比较(尽管您会被弃用警告setSeconds)。使用模拟时间戳进行测试:

import java.sql.Timestamp;

public class TestTimestamp {

     public static void main(String []args){
        Timestamp ts1 = Timestamp.valueOf("2011-12-25 11:12:13");
        Timestamp ts2 = Timestamp.valueOf("2011-12-25 11:12:14");

        ts1.setSeconds(0);
        ts1.setNanos(0);
        ts2.setSeconds(0);
        ts2.setNanos(0);

        System.out.println(ts1);
        System.out.println(ts2);
        //should print false since they're now identical
        System.out.println(ts2.after(ts1));
    }
}

如果您需要使用LocalDateTime,请执行以下操作:

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class Test{

     public static void main(String []args){
        Timestamp ts1 = Timestamp.valueOf("2011-12-25 11:12:13");
        Timestamp ts2 = Timestamp.valueOf("2011-12-25 11:12:14");

        LocalDateTime dt1 = ts1.toLocalDateTime().truncatedTo(ChronoUnit.MINUTES);
        LocalDateTime dt2 = ts2.toLocalDateTime().truncatedTo(ChronoUnit.MINUTES);

        System.out.println(dt1);
        System.out.println(dt2);
        //should print false since they're now identical
        System.out.println(dt2.isAfter(dt1));
     }
}

答案 1 :(得分:2)

我认为MadProgrammer’s suggestion to use truncatedTo最好:

    OffsetDateTime date1 = OffsetDateTime.parse("2018-05-25T13:55:24.000+05:30");
    OffsetDateTime date2 = OffsetDateTime.parse("2018-05-31T08:31:00.000+05:30");

    if (date1.truncatedTo(ChronoUnit.MINUTES).isAfter(date2.truncatedTo(ChronoUnit.MINUTES))) {
        System.out.println("Is after ignoring seconds and smaller");
    } else {
        System.out.println("Is on or before ignoring seconds and smaller");
    }

在这种情况下输出:

  

在忽略秒和更小的

之前或之前

truncatedTo(ChronoUnit.MINUTES)将秒和较小单位(低至纳秒)设置为0.由于日期时间是不可变的,因此返回修改后的副本。来自the docs of the method

  

截断返回原始日期时间的副本和字段   小于指定的单位设置为零。例如,截断   分钟单位将设置秒的秒和纳秒   字段为零。

如果您使用ZonedDateTime,没问题,它也有truncatedTo方法具有相同的效果,因为java.time的类更多。

答案 2 :(得分:1)

与使用DateFormat或smth相比,这不是原生的。像这样,但这是如何做到这一点的最简单方法:

public static int compareUpToMinutes(long d1, long d2) {
    return Long.compare(d1 / 10000, d2 / 10000);
}

<强> 示例:

final ZonedDateTime date = ZonedDateTime.now();
final Function<ZonedDateTime, Long> milli = d -> d.withSecond(10).toInstant().toEpochMilli();

compareUpToMinutes(milli.apply(date.withSecond(10)), milli.apply(date.withSecond(11))); //  0 => d1 = d2
compareUpToMinutes(milli.apply(date.withMinute(10)), milli.apply(date.withMinute(11))); // -1 => d1 < d2
compareUpToMinutes(milli.apply(date.withMinute(22)), milli.apply(date.withMinute(21))); //  1 => d1 > d2

答案 3 :(得分:0)

请参阅以下内容,希望您能与他们联系。

SQL-Server 2008及更高版本: CAST(时间戳AS DATE)

SQL-Server 2005及更早版本  DATEADD(DAY,DATEDIFF(DAY,0,timestamp),0)

SQLite的  DATE(时间戳)

甲骨文  TRUNC(时间戳)

的MySQL DATE(时间戳)