在插入 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 点。该程序必须将其理解为一天的差异,因此我必须进行四舍五入。
有什么方法可以做到这一点还是我必须自己写?
[我知道这是一篇旧帖子] 对于日期差异,这两种方法可能对其他人有帮助。由于您使用的是 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() 等...)