Pregunta

Estoy tratando de escribir un simple método de utilidad para añadir aninteger número de días a una Joda tiempo instantánea.Aquí está mi primer intento.

/**
 * 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();
}

Esto funciona bien para la mayor parte, excepto cuando se considere el ejemplo cuando el número de días después de la toma a través de la BST / GMT límite.He aquí un pequeño ejemplo.

public class DateAddTest {

/** * Zona a utilizar para la entrada y salida de */ private static final DateTimeZone ZONA = DateTimeZone.forId("Europe/madrid");

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

}

Creo que este problema es debido a que el intervalo no toma en cuenta el hecho de que ha de cruzar el bst límite.Todas las ideas de una mejor manera de implementar esto sería apreciada.

¿Fue útil?

Solución 3

Esta es la solución que se ha elegido.

/**
* 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();
}

Otros consejos

Si usted quiere tratar con fechas, no use instantes.Sospecho que es correctamente adición de 48 horas a la instantánea.

El uso de un LocalDate en su lugar, y luego el plusDays método.

Si quieres saber el instante en que se produce n días después de que el especificado instante, en el mismo momento del día, podríamos sin duda el trabajo de una manera de hacer que (dividir el instante LocalDate y un LocalTime, avanzar en la LocalDate y, a continuación, volver a montar, o comprobar si LocalDateTime hace lo que quiere), pero que necesita para trabajar de lo que desea que suceda si el tiempo original se produce dos veces en el nuevo día, o no ocurrir en absoluto.

EDITAR:Bien, entonces usted necesita para trabajar con un instante.¿Que tienen que estar en una zona horaria original?Pueden usar la UTC?Que alejaría los problemas de DST.Si no, ¿qué quieres hacer en casos de ambigüedad o de la no-existencia (por ejemplo,a las 12.30 am antes de cada una de las transiciones).

Suponiendo que el resto de su código:

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));
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top