我有due_date
= 2014-05-09 11:36:41.816
。
我想查看条件是,如果今天的日期与due_date
或1 day less then due_date
相同,那么用户可以renew
其他方式必须显示too early to renew
的消息。
表示如果我在date 8
续订,则用户可以执行,但如果用户在date 7
上执行,则不允许他显示消息。
我知道要检查同一天意味着date 9
,我可以使用:
Timestamp t = new Timestamp(new Date().getTime());
if (t.compareTo(due_date)==0){
//renew book
}
但我不知道在计算前1天该怎么做。 所以要做的任何指导。
答案 0 :(得分:2)
您应该在Java 8中使用Joda-Time或新的java.time,因为旧的java.util.Date和.Calendar类非常麻烦。
你不应该忽视时区问题。省略时区意味着您的JVM(主机计算机)默认时区将适用。您的结果会有所不同。
" day"的定义和"昨天"取决于您的特定时区。
使用proper time zone name(主要是大陆斜线城市)。避免使用3或4个字母代码,因为它们既不标准也不唯一。
如果输入字符串没有时区偏移,意味着它位于UTC,则使用内置常量DateTimeZone.UTC
指定。
Joda-Time提供Interval类来定义时间跨度。在您的情况下,跨度是两天,截止日期加上前一天。 (顺便说一句,如果你更加努力地集中注意力并简化你的问题,那么你发布的问题和你的编程都会有所改进。)
通常在日期工作中我们使用"半开"定义跨度的方法。这意味着开头是包容性的,并且为了比较目的而排除结尾。因此,出于您的目的,我们希望从first moment of the day before due date
向上运行,但不包括,first moment of the day *after* due date
。
您的输入字符串几乎为ISO 8601标准格式。只需用T
替换SPACE即可。 Joda-Time内置了ISO 8601格式的解析器。
Joda-Time 2.3中的示例代码。
String inputDueDateRaw = "2014-05-09 11:36:41.816"
String inputDueDate = inputDueDateRaw.replace( " ", "T" );
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime due = new DateTime( inputDueDate, timeZone ); // Note the time zone by which to interpret the parsing of the string.
DateTime dayBeforeDue = due.withTimeAtStartOfDay().minusDays( 1 ).withTimeAtStartOfDay();
DateTime dayAfterDue = due.withTimeAtStartOfDay().plusDays( 1 ).withTimeAtStartOfDay(); // Half-open. Up to but not including day after.
Interval renewalInterval = new Interval( dayBeforeDue, dayAfterDue );
测试当前时刻是否在该时间间隔内,使用半开方法进行比较。
boolean isNowEligibleForRenewal = renewalInterval.contains( DateTime.now() );
答案 1 :(得分:1)
实际值a.compareTo(b)
返回毫无意义。您唯一可以信任的是,如果它是正a
比“{1}}更大”,如果它是负数,b
是“更小”。你不能指望它的绝对值来确定两者之间的差异。
然而,您可以只比较两个日期的unix时间表示:
a
答案 2 :(得分:0)
另一种方法是使用Calendar对象:
Calendar today = Calendar.getInstance();
today.setTimeInMillis(System.currentTimeMillis()); // time today
Timestamp dueDateTs = new Timestamp(...);
Calendar dueDate = Calendar.getInstance();
dueDate.setTimeInMillis(dueDateTs.getTime());
dueDate.roll(Calendar.DAY_OF_YEAR, false); // to subtract 1 day
if(today.after(dueDate)) {
// do your magic
}