代码之家  ›  专栏  ›  技术社区  ›  uma

需要比较没有秒的日期对象

  •  0
  • uma  · 技术社区  · 6 年前

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

    日期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 回复  |  直到 6 年前
        1
  •  3
  •   ACHC    6 年前

    假设你从 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));
         }
    }
    
        2
  •  3
  •   Anonymous    6 年前

    我认为 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 ,没问题,它也有 截断为 方法具有相同的效果,因为有更多的 java.time .

        3
  •  1
  •   Oleg Cherednik    6 年前

    这与使用 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
    
        4
  •  0
  •   Anushka Ekanayake    6 年前

    请参考以下内容,希望您能找到解决方案。

    SQL Server 2008及更高版本: CAST(时间戳为日期)

    SQL Server 2005及更早版本 DATEADD(天,DATEDIFF(天,0,时间戳),0)

    数据库 日期(时间戳)

    神谕 TRUNC(时间戳)

    MySQL 日期(时间戳)