Добавление количества дней в JodaTime Instant - PullRequest
6 голосов
/ 29 июня 2009

Я пытаюсь написать простой вспомогательный метод для добавления количества дней до целого числа Joda instant . Вот мой первый удар.

/**
 * Adds a number of days specified to the instant in time specified.
 *
 * @param instant - the date to be added to
 * @param numberOfDaysToAdd - the number of days to be added to the instant specified
 * @return an instant that has been incremented by the number of days specified
 */
public static Instant addNumberOfDaysToInstant(final Instant instant, final int numberOfDaysToAdd) {
    Days days = Days.days(numberOfDaysToAdd);
    Interval interval = new Interval(instant, days);
    return interval.getEnd().toInstant();
}

Это прекрасно работает по большей части, за исключением случаев, когда вы рассматриваете пример, когда добавленное количество дней переносит вас через границу BST / GMT. Вот небольшой пример.

public class DateAddTest {

/ ** * Зона, используемая для ввода и вывода * / приватное статическое окончание DateTimeZone ZONE = DateTimeZone.forId ("Европа / Лондон");

/**
 * Formatter used to translate Instant objects to & from strings.
 */
private static final DateTimeFormatter FORMATTER = DateTimeFormat.forPattern(DATE_FORMAT).withZone(ZONE);


/**
 * Date format to be used
 */
private static final String DATE_FORMAT = "dd/MM/yyyy";


public static void main(String[] args) {

 DateTime dateTime = FORMATTER.parseDateTime("24/10/2009");
 Instant toAdd = dateTime.toInstant();
 Instant answer = JodaTimeUtils.addNumberOfDaysToInstant(toAdd, 2);

 System.out.println(answer.toString(FORMATTER)); //25/10/2009
}

}

Я думаю, что эта проблема заключается в том, что интервал не учитывает тот факт, что он пересекает границу bst. Будем благодарны за любые идеи лучшего способа реализации этого.

Ответы [ 3 ]

8 голосов
/ 29 июня 2009

Если вы хотите иметь дело с датами , не используйте моменты. Я подозреваю, что это правильно добавляет 48 часов к моменту.

Вместо этого используйте LocalDate, а затем метод plusDays.

Если вы хотите узнать момент, который наступает через n дней после указанного момента, в одно и то же время дня, мы, без сомнения, могли бы найти способ сделать это (разделить момент на LocalDate и LocalTime, продвиньте LocalDate и затем снова соберите, или проверьте, делает ли LocalDateTime то, что вы хотите), но вам нужно решить, что вы хотите, чтобы произошло, если исходное время встречается дважды в новый день или не происходит в все.

РЕДАКТИРОВАТЬ: Хорошо, так что вам нужно работать с мгновением. Это должно быть в оригинальном часовом поясе? Не могли бы вы использовать UTC? Это сняло бы проблемы DST. Если нет, что вы хотите, чтобы он делал в случаях двусмысленности или небытия (например, в 12:30 перед каждым переходом).

2 голосов
/ 29 июня 2009

Предполагая остаток вашего кода:

public static void main(String[] args) {

  DateTime dateTime = FORMATTER.parseDateTime("24/10/2009");
  Instant pInstant = dateTime.withFieldAdded(DurationFieldType.days(),2).toInstant();
  System.out.println("24/10/2009  + 2 Days = " + pInstant.toString(FORMATTER));
}
0 голосов
/ 30 июня 2009

Это решение, которое было выбрано.

/**
* Zone to use for input and output
*/
private static final DateTimeZone ZONE = DateTimeZone.forId("Europe/London");

/**
 * Adds a number of days specified to the instant in time specified.
 *
 * @param instant - the date to be added to
 * @param numberOfDaysToAdd - the number of days to be added to the instant specified
 * @return an instant that has been incremented by the number of days specified
 */
public static Instant addNumberOfDaysToInstant(final Instant instant, final int numberOfDaysToAdd) {
    return instant.toDateTime(ZONE).withFieldAdded(DurationFieldType.days(), numberOfDaysToAdd).toInstant();
}
...