2014-04-09 60 views
5
// someTime is epoch in millis (UTC) 

final long timeNow = new Date().getTime(); 
final long midnight = timeNow - timeNow % (3600 * 24 * 1000L); 
final long yesterdayMidnight = midnight - (3600 * 24 * 1000L); 


// check if same day. 
if (someTime >= midnight) 
    // do something 

// check if yesterday 
if (someTime >= yesterdayMidnight) 

編輯:我的目的是檢查someTime是否在同一天或前一天沒有做太多的重量級的東西。這是否適用於夏令時?

這是白天節能的原因嗎?爲什麼?如果不是,最簡單的邏輯是什麼? (在你的代碼,這是處理中的「自Unix毫秒爲單位」來肯定),一切都在UTC,有效地 -

+0

如果你說新的日期(); ,這意味着你指的是你係統的當前日期。無論您的系統日期設置爲何,您只會獲得該時間。 – Stunner

+1

@MarounMaroun我相信這個問題實際上是「使用此代碼時可以安全考慮可能的夏令時開關」。 –

+0

@IvayloStrandjev感謝您的澄清。我已更改標題 – Lucas

回答

4

您當前的代碼沒有任何本地時區。

如果你想使你的代碼時區敏感的,你應該使用(按優先順序排列):

使用更高層次的抽象如果可能的話 - 你的代碼應該做的儘可能少的低級別操縱時間。

編輯:現在我們知道的宗旨,這裏是在約達時間的範例:

public void calculate(Instant now, Instant then, DateTimeZone zone) { 
    LocalDate today = new LocalDate(now, zone); 
    LocalDate otherDay = new LocalDate(then, zone); 
    if (otherDay.equals(today)) { 
     // Today day 
    } else if (otherDay.equals(today.minusDays(1)) { 
     // Yesterday 
    } else { 
     // Neither today nor yesterday 
    } 
} 

注意怎麼這裏有什麼水平低 - 我們只是制定出此期限的每個值(現在,然後)落在給定的時間範圍內,然後進行比較。

+0

+1對'java.time' – ifloop

0

在某些情況下,考慮到夏令時,您的支票將失敗。假設現在是夏令時發生的那一天,我們已經將時鐘向前撥了3點。因此,自午夜以來只有4個小時,但實際上是5.因此,您的代碼中的midnight將是5小時前的時間。這意味着,如果someTime在5小時前和4小時前(例如4小時半)之間,實際上是昨天,那麼您的算法將會報告它今天的情況。

+0

今天剛剛看到您的評論。當地時間的第5個小時被映射到UTC的第4個小時,所以午夜是在4小時前的5點(當地)。事實上,由於所有的UTC都沒有夏令時,所以我認爲我的算法是正確的。 UTC就像一個飛行在線性路徑中的箭頭(不考慮相對論效應) – Lucas

0

從夏令時看來這似乎不正確。首先,someTime日期的時區是什麼?日光節省的時間(實際上)是什麼時候(一小時+/-)? 如果你使用Joda庫,有一個方便的方法DateTime.isBefore(),它會返回一個日期是否在另一個之前。