如何在Java中比较FileTime和LocalDateTime个对象?
我想将文件(Files.getLastModifiedTime(item)
)中的FileTime对象与当前时间(LocalDateTime.now()
)进行比较。但它们并不兼容。我该如何比较它们?
答案 0 :(得分:6)
FileTime
API旨在鼓励您使用Instant
而不是LocalDateTime
:
Instant now = Instant.now();
FileTime ft = Files.getLastModifiedTime(item);
if (ft.toInstant().isAfter(now)) { ... }
请注意,Instant
在这种情况下比LocalDateTime
更有意义,因为它代表了现实生活中的唯一即时“。而LocalDateTime
可能不明确,例如在夏令时更改期间。
答案 1 :(得分:2)
您可以立即从FileTime获取并使用即时创建LocalDateTime对象。
实施例
FileTime fileTime = Files.getLastModifiedTime(item);
LocalDateTime now = LocalDateTime.now();
LocalDateTime convertedFileTime = LocalDateTime.ofInstant(fileTime.toInstant(), ZoneId.systemDefault());
现在你可以比较一下& convertedFileTime。
请记住,这并没有考虑到可以改变的时区。
您也可以使用Instant
。
答案 2 :(得分:0)
这些是不同的时间结构。您可以使用toInstant
方法将它们转换为相同的类型。但是LocalDateTime需要时区。我想您只需要当前的系统时钟时间,因此您应该使用LocalDateTime.now()
代替Clock.systemUTC().instant()
,因此您不需要转换。
此外,如果将Clock注入代码中,从单元测试中模拟将更容易,而不是依赖于为您提供系统时间的静态方法。
答案 3 :(得分:0)
我在处理时间,日期,时区等方面的做法......我通常将这些对象转换为Unix时间戳,然后进行必要的操作。
long lastModifiedFileTime = Files.getLastModifiedTime(item).toMillis()/1000;
long now = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
这样做会,但也许您应该考虑使用Instant而不是LocalDateTime,在处理时区时(根据您的c要求),内容会变得过于复杂。
long now = Instant.now().getEpochSecond();
您也可以使用即时对象
Instant now = Instant.now();
Instant lastModifiedFileTime = Files.getLastModifiedTime().toInstant();