我搜索了很多,但我找到了一种从给出当前时间的日历实例中添加或减去时间的方法。如何从给定文件的上次修改时间中减去时间?
更新: 我一直在使用Java1.4。这就是我无法找到任何方法来做到这一点的原因。 我将修改日期提取为字符串。我想将此字符串转换为日历对象,以便我更容易将日历对象的 add() 应用于时间。我也遇到过同样的问题。这种做法正确吗?可以请您帮忙吗
Path filePath = Paths.get("myFile.txt");
Duration timeToSubtract = Duration.ofMinutes(7);
FileTime lastModified = Files.getLastModifiedTime(filePath);
Instant lastModifiedInstant = lastModified.toInstant();
Instant timeBeforeLastModified = lastModifiedInstant.minus(timeToSubtract);
System.out.println("Time after subtraction is " + timeBeforeLastModified);
刚刚在我的计算机上运行,我得到了以下输出:
减去后的时间为2017-02-18T03:06:04Z
末尾的
Z
表示UTC。 Instant::toString
(将 Instant
附加到字符串时隐式调用)始终生成 UTC 格式的字符串。
我正在使用现代的 Java NIO API 和 java.time,现代的 Java 日期和时间 API。在本例中,NIO 为我们提供了一个
FileTime
表示文件上次修改的时间。为了进行时间数学计算,我首先将其转换为 Instant
,它是 java.time 的中心类。 minus
的 Instant
方法减去 Duration
的时间量,并返回一个新的 Instant
对象。
不要使用
Calendar
。该类设计得很糟糕,而且早已过时了。
链接: Oracle 教程:日期时间 解释如何使用 java.time。
如果您不必使用日历,那么只需使用自 Java8 以来可用的新 Java DateTime API https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
你有非常好的方便方法,如加/减等。
例如你可以简单地写
LocalTime now = LocalTime.now();
now.minusHours(2);
时间戳(如
long
)您可以在Calendar
实例中设置。之后您可以add()
时间。
public void time() {
long timeStamp = 31415926535L;
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
// Substract 1 hour
calendar.add(Calendar.HOUR, -1);
// Add 20 minutes
calendar.add(Calendar.MINUTE, 20);
}
自 Java 8 起,
java.util.Date
、java.util.Calendar
和 java.text.SimpleDateFormat
现已成为旧版。所以我编辑我的代码,删除遗留类。
谢谢@Ole V.V.和@Basil Bourque 指出了我的问题。
我对你的问题感到困惑。我猜你想修改文件的最后修改时间。
所以我写下了代码。
import java.io.File;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
public class Test {
private static final long ONE_SECOND = 1000L;
private static final long ONE_MINUTE = 60L * ONE_SECOND;
public static void main(String[] args) {
File file = new File("test.txt");
if (!file.exists()) {
System.err.println("File doesn't exist.");
return;
}
//get file's last modified, in millisecond
long timestamp = file.lastModified();
System.out.println("File's last modified in millisecond: " + timestamp);
//print time for human, convert to LocalDateTime
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());
System.out.println("File's last modified in LocalDateTime: " + localDateTime);
//add a minute
timestamp = timestamp + ONE_MINUTE;
//modify file's last modified
boolean isModified = file.setLastModified(timestamp);
if (isModified) {
System.out.println("Update file's last modified successfully.");
System.out.println("File's last modified in millisecond: " + file.lastModified());
//print time for human, convert to LocalDateTime
System.out.println("File's last modified in LocalDateTime: " +
LocalDateTime.ofInstant(Instant.ofEpochMilli(file.lastModified()), ZoneId.systemDefault()));
} else {
System.err.println("Update file's last modified failed.");
}
}
}
此外,如果要修改时间戳,只需使用+/-操作即可。
并且您可以将时间戳转换为LocalDateTime,并使用LocalDateTime的api轻松修改时间。
public void modifyTime() {
//modify timestamp: add one second
long timestamp = System.currentTimeMillis();
timestamp = timestamp + 1000L;
//convert timestamp to LocalDateTime
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());
//modify LocalDateTime
//add a minute
localDateTime = localDateTime.plusMinutes(1);
//subtract a second
localDateTime = localDateTime.minusSeconds(1);
}
如果我误解了你的想法,请告诉我。
您可以像这样使用
setTime()
:
yourTimeStamp.setTime(yourTimeStamp.getTime() + TimeUnit.MINUTES.toMillis(minutesToAdd));