tl; dr
LocalDateTime later = LocalDateTime.parse ("2010-01-14T19:16:17").plus(Period.parse ("P10M3D")).plus(Duration.parse ("PT1H10M5S")) ;
ISO 8601
La representación de un lapso de tiempo utilizando el mismo formato que un momento es la creación de confusión. Un lapso no es en absoluto igual a un momento.
En lugar de utilizar el formato YYYY-MM-DD HH-MM-SS
durante un lapso de tiempo, sugiero que utilice el formato ISO 8601 estándar de PnYnMnDTnHnMnS. En este formato, el P
marca el comienzo (presumiblemente para "Período") y el T
separa la parte años-mes-días de la porción horas-minutos-segundos.
Valores de ejemplo:
PT1H30M
→ Una hora y media horas.
P3Y6M4DT12H30M5S
→ Tres años, seis meses, cuatro días, doce horas, treinta minutos y cinco segundos.
P10M3DT1H10M5S
→ La duración de su duda es de 0000-10-03 01:10:05
.
java.time
la pregunta y el otro responde utilizan las clases de fecha y hora viejos molestos ahora anticuadas por el marco java.time incorporado en Java 8 y versiones posteriores. Ver Oracle Tutorial. Gran parte de la funcionalidad de java.time ha sido retransportada a Java 6 & 7 en ThreeTen-Backport y adaptada a Android en ThreeTenABP.
Las clases java.time usan formatos ISO 8601 de forma predeterminada al analizar y generar cadenas que representan valores de fecha y hora.
La pregunta no proporciona ninguna información de zona horaria, así que aquí usamos la clase LocalDateTime
. Si conocemos una compensación desde UTC, usaríamos la clase OffsetDateTime
, y si aún mejor conociéramos una zona horaria, usaríamos la clase ZonedDateTime
.
Los intervalos de tiempo en java.time se dividen entre un par de clases. Los años-meses-días están representados por la clase Period
, y las horas-minutos-segundos se manejan por la clase Duration
.
Combinando estos tiempos, de hecho podemos realizar operaciones matemáticas de fecha y hora. Aquí agregamos un lapso de tiempo a una fecha de inicio para obtener una fecha-hora resultante. Y lo hacemos en muy pocas líneas de código. El resultado es de hecho el esperado por la Pregunta.
Convertimos las cadenas de entrada al formato canónico ISO 8601 reemplazando el espacio en el medio con un T
.
LocalDateTime ldt = LocalDateTime.parse ("2010-01-14 19:16:17".replace (" " , "T"));
//"0000-10-03 01:10:05"
Period period = Period.parse ("P10M3D");
Duration duration = Duration.parse ("PT1H10M5S");
LocalDateTime result = ldt.plus (period).plus (duration);
Comparar con el resultado esperado en la pregunta.
LocalDateTime expectation = LocalDateTime.parse ("2010-11-17 20:26:22".replace (" " , "T"));
Boolean isSame = result.equals (expectation);
Volcar a la consola.
System.out.println ("ldt: " + ldt + " + period: " + period + " + duration: " + duration + " is result: " + result + " compared to expectation: " + expectation + " is the same: " + isSame);
ldt: 2010-01-14T19: 16: 17 + período: P10M3D + Duración: PT1H10M5S es resultado: 2010-11-17T20: 26: 22 en comparación con la expectativa: 2010-11-17T20: 26:22 es la misma: la verdadera
¿Cómo puede la suma de dos fechas del calendario será de ninguna manera significativa? (Si está intentando agregar un intervalo, esta parece una manera extraña de almacenar los datos.) –
año 0000: una fecha extraña. – Bozho
@Diego: Tome este ejemplo: ¿cuál sería la respuesta al "3 de mayo de 2009" + "23 de julio de 1984"? La pregunta no tiene sentido, ni tampoco la respuesta. – skaffman