我在数据库中使用了两个日期时间对象。我需要在没有秒的情况下进行比较。
日期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;
}
但我需要在没有第二部分的情况下进行上述比较。需要一些专家帮助才能做到。
答案 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(时间戳)