我有两个时间戳值。喜欢
Timestamp date1;
Timestamp date2;
现在我想找到没有。这两个timeStamps之间的天数,例如java
int no_of_days = difference(date2 - date1)
以上代码仅用于澄清问题。只需忽略编码错误即可。
答案 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.Timestamp
到LocalDateTime
的转换。仅当您还以这种方式存储了时间戳时,这才是正确的。
顺便说一句,使用兼容JDBC-4.2的驱动程序,您还可以retrieve your java.time
-type directly,也可以参见related post here on SO。