Лучший способ добавить промежуток времени (long и TimeUnit) в java.util.Date? - PullRequest
3 голосов
/ 27 мая 2011

Я пытаюсь реализовать этот метод:

/**
 * Adds the given span to the given date and returns a new date.
 */
public java.util.Date add(java.util.Date d, long span, java.util.concurrent.TimeUnit unit) {
    // ...
}

Я могу просто включить устройство. Есть ли библиотека, которая делает это? Apache Commons? Joda

Ответы [ 3 ]

8 голосов
/ 27 мая 2011

Вам не нужно включать устройство - просто спросите его нужное количество миллисекунд:

return new Date(d.getTime() + unit.toMillis(span));

С другой стороны, я бы определенно попытался использовать Joda вместо:)

2 голосов
/ 27 мая 2011

Есть ли библиотека, которая делает это?Apache Commons?Joda?

Да, если TimeUnit не является обязательным, Jodatime предлагает для этого удобные (и безопасные для DST!) Методы.

DateTime now = new DateTime();
DateTime tomorrow = now.plusDays(1);
DateTime lastYear = now.minusYears(1);
DateTime nextHour = now.plusHours(1);
// ...

Изучите DateTime API , чтобы узнать больше методов.

0 голосов
/ 27 мая 2011

Правильный способ сделать это нетривиально.У вас есть два случая (при условии, что вы не против игнорировать високосные секунды).

Если вы хотите интерпретировать TimeUnit.DAYS как точные 24 часа (в отличие от 23-25 ​​часов в зависимости от изменений летнего времени)тогда вы можете просто добавить миллисекунды:

public static Date add(Date base, long span TimeUnit unit) {
  return new Date(base.getTime() + unit.toMillis(span);
}

Если вы хотите распознать летнее время, то вам понадобится особый случай DAYS:

public static Date add(Date base, long span TimeUnit unit) {
  if (TimeUnit.DAYS.equals(unit)) {
    Calendar c = Calendar.getInstance();
    c.setTime(base);
    c.add(Calendar.DAY_OF_MONTH, (int) span);
    return c.getTime();
  }
  return new Date(base.getTime() + unit.toMillis(span);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...