2014-05-08 104 views
0

我有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天做。 所以任何指導要做。

回答

2

體面日期時庫

您應該在Java 8中使用Joda-Time或新的java.time,因爲舊的java.util.Date和.Calendar類是衆所周知的tr oublesome。

時區

您不應該忽略時區問題。省略時區意味着您的JVM(主機)的默認時區將適用。你的結果會有所不同。

「日」和「昨日」的定義取決於您的特定時區。

使用proper time zone name(主要是大陸斜線城市)。避免3或4個字母代碼,因爲它們既不標準也不唯一。

如果您的輸入字符串沒有時區偏移量,意味着它在UTC中,則使用內置常量DateTimeZone.UTC進行指定。

間隔

喬達時間提供Interval類來定義時間跨度。在你的情況下,跨度是兩天,即截止日期加上前一天。 (順便說一句,無論您發佈的問題和你的節目會,如果你在聚焦和簡化了您的問題,因爲我只是在前面的句子做了努力工作改善。)

半開

通常在日期時間我們使用「半開放」方法來定義跨度。這意味着開始是包容性的,並且爲了比較的目的而排除結尾。所以爲了您的目的,我們要從first moment of the day before due date到最高,但是不包括first moment of the day *after* due date

ISO 8601

你輸入的字符串是幾乎ISO 8601標準格式。只需將空間替換爲T即可。 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

實際值a.compareTo(b)返回沒有意義。唯一值得信任的是,如果它是正數a是「大於」b,如果它是負數,則a是「較小」。你不能指望它的絕對值來確定兩者之間的差異。

你可以,但是,只是比較兩個日期的UNIX時間表示:

TimeStamp due_date = ...; 
long dueDateMillis = due_date.getTime(); 
long t = System.currTimeMillis(); 
long threshold = 24L * 60L * 60L * 1000L; // One day in milliseconds 

if (dueDateMillis - t <= threshold) { 
    // Renew book 
} 
+0

我的截止日期是在時間戳,所以我如何使用它只要?你的第二行顯示。 –

+0

@ user3145373使用'getTime()'提取unixtime表示 - 我編輯了我的答案以包含它。 – Mureinik

+0

是的,我已經看到它,讓我檢查它在我的代碼.. –

0

另一種方式來做到這一點是使用日曆對象:

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 
}