Как добавить минуты к отметке времени, которая у меня уже есть? - PullRequest
0 голосов
/ 11 марта 2019

Я много искал, но нашел способ добавить или вычесть время из экземпляра календаря, который дает текущее время. Как вычесть время из времени последнего изменения данного файла?

ОБНОВЛЕНИЕ: Я использую Java1.4. Вот почему я не могу найти какие-либо методы для этого. Я извлек модифицированную дату в виде строки. Я хотел преобразовать эту строку в соответствии с объектом календаря, чтобы мне было проще применить add () объекта календаря ко времени. Я столкнулся с проблемами с тем же. это правильный подход? Не могли бы вы помочь

Ответы [ 5 ]

1 голос
/ 11 марта 2019

NIO и java.time

    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-интерфейс даты и времени. NIO дает нам FileTime в этом случае, обозначающее время последней модификации файла. Чтобы сделать нашу математику времени, я сначала конвертирую ее в Instant, который является центральным классом java.time. Метод minus для Instant вычитает Duration, количество времени и возвращает новый Instant объект.

Не используйте Calendar. Этот класс был плохо спроектирован и давно устарел.

Ссылка: Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.

1 голос
/ 11 марта 2019

Метка времени (как 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);
}
1 голос
/ 11 марта 2019

Если вам не нужно использовать календарь, чем просто использовать новый API Java DateTime, доступный с Java8 https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html

Там у вас есть очень удобные методы, такие как плюс / минус и т. Д.

Например, вы можете просто написать

  LocalTime now = LocalTime.now();
  now.minusHours(2);
0 голосов
/ 11 марта 2019

Вы можете использовать setTime () следующим образом:

yourTimeStamp.setTime (yourTimeStamp.getTime () + TimeUnit.MINUTES.toMillis (minutesToAdd));

0 голосов
/ 11 марта 2019

Поскольку Java 8, java.util.Date, java.util.Calendar и java.text.SimpleDateFormat теперь являются устаревшими.Поэтому я редактирую свои коды, удаляю устаревшие классы.

Спасибо @Ole VV и @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, и используйте API LocalDateTime, чтобы легко изменять время.

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);
}

Если я неправильно понял вашу идею, пожалуйста, дайте мне знать.

...