两个时间戳之间的天数

时间:2018-12-27 16:15:56

标签: java timestamp days

我有两个时间戳值。喜欢

Timestamp date1;
    Timestamp date2;

现在我想找到没有。这两个timeStamps之间的天数,例如java

int no_of_days = difference(date2 - date1)

以上代码仅用于澄清问题。只需忽略编码错误即可。

3 个答案:

答案 0 :(得分:1)

您可以为此使用Duration(适用于Java 8):

Duration between = Duration.between(date1.toInstant(), date2.toInstant());

int no_of_days = between.get(ChronoUnit.DAYS);

答案 1 :(得分:1)

如果您正在使用Java8,它将更加容易。这是一种实现方法。

Duration.between(date1.toLocalDateTime(), date2.toLocalDateTime()).toDays();

答案 2 :(得分:1)

到目前为止,此处给出的其他答案只能使用类java.time.Duration处理固定为24小时的天单位。如果您在夏令时切换时区中考虑时间戳,则可能不是您想要的。

在从冬季到夏季的更改期间,一个日历日只能持续23个小时(在极少数情况下甚至是23:30)。在秋天,当切换回冬季时,日历天可能会超过24小时。因此,您还需要一个时区来处理这种情况,以便以正确的方式计算持续时间。

如果时间戳是由瞬间存储在数据库中的,建议的解决方案:

ZonedDateTime zdt1 = date1.toInstant().atZone(ZoneId.systemDefault());
ZonedDateTime zdt2 = date2.toInstant().atZone(ZoneId.systemDefault());
long days = java.time.temporal.ChronoUnit.DAYS.between(zdt1, zdt2);

当然,您可以自由指定系统时区以外的任何其他时区。结果可能会因所选区域而异。

建议的解决方案,如果您的时间戳记来自LocalDateTime,而没有任何区域上下文:

LocalDateTime ldt1 = date1.toLocalDateTime();
LocalDateTime ldt2 = date2.toLocalDateTime();
long days = java.time.temporal.ChronoUnit.DAYS.between(ldt1, ldt2);

这里,我仍然更喜欢枚举ChronoUnit.DAYS,因为类型java.time.Duration在内部仅存储秒和纳秒,因此更适合于类似机器的时间戳。还有一点要注意:第二种解决方案隐式使用您的系统时区来进行从java.sql.TimestampLocalDateTime的转换。仅当您还以这种方式存储了时间戳时,这才是正确的。

顺便说一句,使用兼容JDBC-4.2的驱动程序,您还可以retrieve your java.time-type directly,也可以参见related post here on SO