6

整数の日数を Joda 時刻に追加するための簡単なユーティリティ メソッドを作成しようとしています。ここに私の最初の刺し傷があります。

/**
 * 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 {

/** * 入力と出力に使用するゾーン */ private static final DateTimeZone ZONE = DateTimeZone.forId("Europe/London");

/**
 * 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 境界を越えているという事実を考慮していないためだと思います。これを実装するためのより良い方法のアイデアをいただければ幸いです。

4

3 に答える 3

8

If you want to deal with dates, don't use instants. I suspect it's correctly adding 48 hours to the instant.

Use a LocalDate instead, and then the plusDays method.

If you want to know the instant that occurs n days after the specified instant, at the same time of day, we could no doubt work out a way of doing that (split the instant into a LocalDate and a LocalTime, advance the LocalDate and then reassemble, or check whether LocalDateTime does what you want) but you need to work out what you want to happen if the original time occurs twice on the new day, or doesn't occur at all.

編集:さて、インスタントで作業する必要があります。それは元のタイムゾーンにある必要がありますか? UTCを使用できますか?これにより、DST の問題が解消されます。そうでない場合、あいまいな場合や存在しない場合に何をしたいですか (たとえば、各トランジションの前の午前 12 時 30 分)。

于 2009-06-29T14:51:44.753 に答える
2

あなたのコードの残りの部分を仮定します:

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));
}
于 2009-06-29T17:07:40.193 に答える
0

これが選択されたソリューションです。

/**
* 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();
}
于 2009-06-30T09:19:38.310 に答える