2017-04-18 107 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