好的,所以我读了这个: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日,那么它应该运行..我该如何实现?
答案 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)
确定日期需要一个时区。
仅使用 java.time 类,从不使用旧版java.util.Date
,Calendar
,java.sql.Date
,java.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" ) )
)
可怕的Date
和Calendar
遗留类在几年前被现代的 java.time 类所取代。
您的问题忽略了时区的关键问题。对于任何给定时刻,日期和时间在全球范围内都随时区变化。您不能不谈论时区就谈论日期。例如,Paris France午夜之后的几分钟是新的一天,而Montréal Québec仍然是“昨天”。
如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将您的[期望/期望时区] [2]明确指定为参数。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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开始。由于诸如夏令时(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 项目中的Interval
和LocalDateRange
类。
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。