2017-04-18 44 views
4

我認爲這已經被問過了,但我找不到anything如何確定ZonedDateTime是否爲「今天」?

使用java.time確定給定的ZonedDateTime是否爲「今天」的最佳方法是什麼?

我已經想出了至少兩種可能的解決方案。我不確定這些方法是否存在漏洞或陷阱。基本想法是讓java.time數字出來,並沒有做任何的數學自己:

/** 
* @param zonedDateTime a zoned date time to compare with "now". 
* @return true if zonedDateTime is "today". 
* Where today is defined as year, month, and day of month being equal. 
*/ 
public static boolean isZonedDateTimeToday1(ZonedDateTime zonedDateTime) { 
    ZonedDateTime now = ZonedDateTime.now(); 

    return now.getYear() == zonedDateTime.getYear() 
      && now.getMonth() == zonedDateTime.getMonth() 
      && now.getDayOfMonth() == zonedDateTime.getDayOfMonth(); 
} 


/** 
* @param zonedDateTime a zoned date time to compare with "now". 
* @return true if zonedDateTime is "today". 
* Where today is defined as atStartOfDay() being equal. 
*/ 
public static boolean isZoneDateTimeToday2(ZonedDateTime zonedDateTime) { 
    ZonedDateTime now = ZonedDateTime.now(); 
    LocalDateTime atStartOfToday = now.toLocalDate().atStartOfDay(); 

    LocalDateTime atStartOfDay = zonedDateTime.toLocalDate().atStartOfDay(); 

    return atStartOfDay == atStartOfToday; 
} 
+1

你問的值是「今天」的值的時區或JVM的默認時區? – Andreas

+0

你不應該說ZonedDateTime now = ZonedDateTime.now()。它始終是當天的日期。意味着它永遠是今天。 – Sedrick

+0

首先,明確「今日」的含義! – slim

回答

7

如果你指的是在缺省時區的今天:

return zonedDateTime.toLocalDate().equals(LocalDate.now()); 

//you may want to clarify your intent by explicitly setting the time zone: 
return zonedDateTime.toLocalDate().equals(LocalDate.now(ZoneId.systemDefault())); 

如果你在同一個時區的意思今天ZonedDateTime:

return zonedDateTime.toLocalDate().equals(LocalDate.now(zonedDateTime.getZone())); 
+0

但默認區域中的'now()'可能與值區域中的日期不同。 – Andreas

+0

@Andreas鍵入得太快 - 謝謝。我相信這個例子也使用了默認的時區。 – assylias

+3

作爲一種很好的風格,我建議在第一個中使用'ZoneId.systemDefault()',否則我會認爲這是一個錯誤,而你打算使用ZonedDateTime中的區域一。 – JodaStephen

相關問題