2014-04-09 33 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(),它会返回一个日期是否在另一个之前。