體面日期時庫
您應該在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());
我的截止日期是在時間戳,所以我如何使用它只要?你的第二行顯示。 –
@ user3145373使用'getTime()'提取unixtime表示 - 我編輯了我的答案以包含它。 – Mureinik
是的,我已經看到它,讓我檢查它在我的代碼.. –