日期比较混乱

时间:2014-05-08 06:33:26

标签: java datetime timestamp date-comparison

我有due_date = 2014-05-09 11:36:41.816

我想查看条件是,如果今天的日期与due_date1 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天该怎么做。 所以要做的任何指导。

3 个答案:

答案 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

您的输入字符串几乎为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
}