检查保存的日期是否是Android当前日期的前一天

时间:2018-09-07 17:04:54

标签: android date

好的,所以我读了这个:Check date with todays date

@sudocode给出了此代码:

Calendar c = Calendar.getInstance();

// set the calendar to start of today
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);

// and get that as a Date
Date today = c.getTime();

// or as a timestamp in milliseconds
long todayInMillis = c.getTimeInMillis();

// user-specified date which you are testing
// let's say the components come from a form or something
int year = 2011;
int month = 5;
int dayOfMonth = 20;

// reuse the calendar to set user specified date
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);

// and get that as a Date
Date dateSpecified = c.getTime();

// test your condition
if (dateSpecified.before(today)) {
  System.err.println("Date specified [" + dateSpecified + "] is before today [" + today + "]");
} else {
  System.err.println("Date specified [" + dateSpecified + "] is NOT before today [" + today + "]");
}

但是假设保存的日期是28/01/2018 11:00 pm,我在28/01/2018 11:15 pm运行此代码,那么这段代码将告诉我保存的日期是之前日期。

我想要的是,代码仅应在保存日期超过一天的情况下运行一个函数...(不是24小时,但实际上是一天或更长时间),可以说保存日期为27/01/2018晚上11:00,当前日期是2018年1月28日,那么它应该运行..我该如何实现?

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

public long daysBetween(Calendar first, Calendar second) {
    long diffInMillis = second.getTimeInMillis() - first.getTimeInMillis();
    return TimeUnit.MILLISECONDS.toDays(diffInMillis);
}

然后问问差异是否> =1。这还假定第二个> =首先。

此示例使用的是标准Java(7)日期资料,因此您应该能够在项目中使用它。

答案 1 :(得分:0)

tl; dr

确定日期需要一个时区

仅使用 java.time ,从不使用旧版java.util.DateCalendarjava.sql.Datejava.sql.Timestamp,等

myResultSet.getObject( 
    … , 
    Instant.class 
)                          // Retrieve a `java.time.Instant` from a column of type akin to the SQL-standard `TIMESTAMP WITH TIME ZONE`. 
.atZone(
    ZoneId.of( "Pacific/Auckland" ) 
)
.toLocalDate()
.isEqual( 
    LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
)

避免使用旧的日期时间类

可怕的DateCalendar遗留类在几年前被现代的 java.time 类所取代。

时区

您的问题忽略了时区的关键问题。对于任何给定时刻,日期和时间在全球范围内都随时区变化。您不能不谈论时区就谈论日期。例如,Paris France午夜之后的几分钟是新的一天,而Montréal Québec仍然是“昨天”。

如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将您的[期望/期望时区] [2]明确指定为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

如果要使用JVM的当前默认时区,请提出要求并作为参数传递。如果省略,则会隐式应用JVM的当前默认值。最好明确一点,因为默认值可能会在运行时的任何时候被JVM中任何应用程序的任何线程中的任何代码更改。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

或指定日期。您可以用数字设置月份,一月至十二月的理智编号为1-12。

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

或者更好的是,使用预定义的Month枚举对象,每年的每个月使用一个。提示:在整个代码库中使用这些Month对象,而不是仅使用整数,可以使您的代码更具自文档性,确保有效值并提供type-safety

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

从不假设00:00:00

此外,请勿假设一天从00:00:00开始。由于诸如夏令时(DST)之类的异常,一天可能会在另一个时间开始,例如01:00:00。让 java.time 确定一天的第一时刻。指定一个时区以产生代表特定时刻的ZonedDateTime对象。

ZonedDateTime startOfToday = LocalDate.now( z ).atStartOfDay( z ) ;
ZonedDateTime startOfYesterday = startOfToday.toLocalDate().minusDays( 1 ).atStartOfDay( z ) ;

对于查询数据库,通常最好使用UTC值。要从我们的时区调整为UTC,只需提取一个Instant

Instant start = startOfToday.toInstant() ;
Instant stop = startOfYesterday.toInstant() ;

准备查询数据库。在这里使用Half-Open方法,其中开始是包含,而结束是排他。因此,不要使用SQL BETWEEN

// SQL for SELECT WHERE when_field >= ? AND when_field < ? 
myPreparedStatement.setObject( 1 , start ) ;
myPreparedStatement.setObject( 2 , stop ) ;

比较日期

如果您只想查看所获取时刻的年龄,请获取即时消息。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

应用时区以获取ZonedDateTime。然后提取仅日期的值。

ZonedDateTime zdt = instant.atZone( z ) ;
LocalDate ld = zdt.toLocalDate() ;  // Extract the date-only value.

比较今天的日期。

LocalDate yesterday = LocalDate.now( z ).minusDays( 1 ) ;  // Subtract one day from today to get yesterday.
Boolean retrievedDateIsYesterday = ld.isEqual( yesterday ) ;

如果要处理大量时间跨度,请参见下面链接的 ThreeTen-Extra 项目中的IntervalLocalDateRange类。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore