如何减去2个java.sql.Date日期?

问题描述 投票:0回答:3

我将一些数据插入到 Sqlite 数据库中,并在插入之前检查当天的记录是否已存在。要检查这一点,我必须查看天数是否>0。例如,2011-8-6 和 2011-8-5 之间的差异(以天为单位)是 1。如何在 Java 中执行此操作?

编辑: 正如 @RayToal 提到的,这可以在数据库中完成,所以我就这样做了:

SELECT julianday('now') - julianday(Date(Date)) from VIDEO_HISTORY;

唯一的问题是它给了我十进制数。例如:3.3442346529103816 现在我必须在 Java 内部决定给定的数字是否为 4 天中的 3 天。 它的代码适用于在 YouTube 上搜索某个术语并将有关每日观看次数的统计数据写入数据库的应用程序。用户可以安排工作,例如每天 20:00 点。但随后他可以决定在 10:00 重新安排这项工作,因此程序必须理解这一点,就像差异是一天一样。所以很明显我必须四舍五入到第一个更大的数字。有什么方法可以做到这一点还是我必须自己写?

编辑2:根据@Michael-O提供的链接,这是最好的解决方案(使用JodaTime):

DateTime start = new DateTime(new GregorianCalendar(2011, 8, 4).getTime());
DateTime end = new DateTime(new GregorianCalendar(2011, 8, 8).getTime());

int numberOfDays = Days.daysBetween(start.toDateMidnight(), end.toDateMidnight()).getDays();
System.out.println(numberOfDays);
java date date-arithmetic
3个回答
3
投票

您可能需要查阅这个教程。此外,您应该考虑使用 Joda Time 的

Period
并参考 stackoverflow 上的 this 答案。


2
投票

如果您想要日历天数(java.time 术语中的Period),则使用(在 Java 8 中):

import java.time.temporal.ChronoUnit;
import java.time.LocalDate;
ChronoUnit.DAYS.between(LocalDate.parse(from.toString()),LocalDate.parse(to.toString())

(这避免了 Java 8 的 java.sql.Date API 中的微妙错误

如果您想要以天为单位的持续时间(以 24 小时为单位的实际经过时间),请使用 Marcelo 的 方法。


0
投票

以下是我创建的用于转至/转自最常见格式的方法:java.util.Date、java.time.LocalDate/LocalDateTime 和 java.sql.Date:

注意:因空间原因删除了异常内容...

//to java.sql.Date
public static java.sql.Date FromUtilDateToSqlDate(java.util.Date dateUtil) {
    java.sql.Date jsd = null;
    try {
        jsd = new java.sql.Date(dateUtil.getTime());
      } catch (Exception ex) {
    }
    return jsd;
}
public static java.sql.Date FromTimeLocalDateToSqlDate(java.time.LocalDate dateLocalDate) {
    java.sql.Date jsd = null;
    try {
        jsd = (java.sql.Date) java.sql.Date.valueOf(dateLocalDate);
      } catch (Exception ex) {
    }
    return jsd;
}

// to java.time.LocalDate
public static java.time.LocalDate FromSqlDateToTimeLocalDate(java.sql.Date dateSql) {
    java.time.LocalDate ld = null;
    try {
        ld = (java.time.LocalDate) dateSql.toLocalDate();
      } catch (Exception ex) {
    }
    return ld;
}
public static java.time.LocalDate FromUtilDateToTimeLocalDate(java.util.Date dateUtil) {
    java.time.LocalDate ld = null;
    try {
        ld = (java.time.LocalDate) dateUtil.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
      } catch (Exception ex) {
    }
    return ld;
}
// to java.util.Date
public static java.util.Date FromSqlDateToUtilDate(java.sql.Date dateSql){
    java.util.Date jud = null;
    try {
        jud = (java.util.Date) new java.util.Date(dateSql.getTime());
     } catch (Exception ex) {
    return jud;
}
public static java.util.Date FromTimeLocalDateToUtilDate(java.time.LocalDate dateLocalDate){
    java.util.Date jud = null;
    try {
        Instant i = dateLocalDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
        jud = java.util.Date.from(i);
      } catch (Exception ex) {
    }
    return jud;
}

HTH 未来,因为我们还有几种约会方式!

(是的,我可以添加对提交的日期对其班级有效、不为空等的验证,但这个想法是回过头来并提供我最初希望找到的一体化答案,这应该有所帮助其他情况相同。这些是名为 DateUtils() 的较大类的一部分,该类具有各种与日期相关的方法,包括时间戳、YYYYMMDDHHMMSS* 内容、Instant() 等...)

© www.soinside.com 2019 - 2024. All rights reserved.