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

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

在插入 SQLite 数据库之前,我检查当天的记录是否已存在(天数 >0)。例如,2011-8-6 和 2011-8-5 之间的差异是 1。如何在 Java 中执行此操作?

这可以在数据库中完成:

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

它给了我一个十进制数:3.3442346529103816。现在我必须在 Java 中决定这个数字是 3 天还是 4 天。

我的应用程序搜索 YouTube 并将每日观看次数写入数据库。用户可以将每日搜索安排在 20:00 点,但也可以将其重新安排到 10:00 点。该程序必须将其理解为一天的差异,因此我必须进行四舍五入。

有什么方法可以做到这一点还是我必须自己写?

java sqlite date date-arithmetic ceil
3个回答
3
投票

如果您想要日历天数(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 的 方法。


2
投票

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

Period
并参考 stackoverflow 上的 this 答案。


0
投票

[我知道这是一篇旧帖子] 对于日期差异,这两种方法可能对其他人有帮助。由于您使用的是 SQLite,因此它应该兼容 SQL,这些适用于 Postgresql/java.sql。*:

*注意:很难删除所有 Logger... 条目并使其有意义,因此剩下的条目指的是使用tinylog 包。我向他们传递了很多不良数据,这有助于确定原因。所以忽略他们...:-) *

/**
     * GetDaysDiff(java.sql.Date dateFrom, java.sql.Date dateTo)
     * 
     * @param dateFrom: java.sql.Date
     * @param dateTo:   java.sql.Date
     * 
     * @return int (WHOLE days difference) NOTE: -1 means failure to calculate
     */
    public static long GetDaysDiff(java.sql.Date dateFrom, java.sql.Date dateTo) {
        long diffDays = -1;
        try {
            if (dateTo == null) {
                dateTo = new java.sql.Date(System.currentTimeMillis());
                Logger.error("dateTo given is null.");
            }
            if (dateFrom == null) {
                dateFrom = new java.sql.Date(System.currentTimeMillis());
                Logger.error("dateFrom given is null.");
            }
            java.time.LocalDate ldtFrom     = dateFrom.toLocalDate(); 
            java.time.LocalDate ldtTo       = dateTo.toLocalDate();
            long diffSigned = (long) ldtFrom.atStartOfDay().until(ldtTo.atStartOfDay(), ChronoUnit.DAYS);
            diffDays = Math.abs(diffSigned);
          } catch (Exception ex) {
        }
        return diffDays;
    }
    public static long GetDaysDiff(java.time.LocalDate dateFrom, java.time.LocalDate dateTo) {
        long daysDiff = -1;
        try {
            long daysSigned = dateFrom.atStartOfDay().until(dateTo.atStartOfDay(), ChronoUnit.DAYS);
            daysDiff = (long) Math.abs(daysSigned);
          } catch (Exception ex) {
        }
        return daysDiff;
    }

以下是我创建的用于转至/转自最常见格式的方法: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.