Dado tres números enteros no negativos y
, m
y d
(de los cuales al menos uno debe ser positivo) y una fecha válida con un año positivo (en cualquier formato razonable, que incluye el año, mes y día, y no hay información adicional), la salida de la fecha que es y
años, m
meses y d
días después de la fecha original.
El calendario gregoriano se debe utilizar para todas las fechas (incluso las fechas anteriores a la adopción del calendario gregoriano).
El método para calcular la próxima fecha es el siguiente:
- Añadir
y
al año - Agregar
m
al mes - Normalice la fecha aplicando reinversiones (por ejemplo,
2018-13-01
->2019-01-01
) - Si el día ha pasado el último día del mes, cámbielo al último día del mes (por ejemplo,
2018-02-30
->2018-02-28
) - Añadir
d
al día - Normalice la fecha aplicando reinversiones (por ejemplo,
2019-01-32
->2019-02-01
)
Los años bisiestos (años divisibles por 4, pero no divisibles por 100 a menos que también sean divisibles por 400) deben manejarse adecuadamente. Todas las entradas y salidas estarán dentro del rango entero representable de su idioma.
Casos de prueba
Los casos de prueba se proporcionan en el formato input => output
, donde input
es un objeto JSON.
{"date":"2018-01-01","add":{"d":1}} => 2018-01-02
{"date":"2018-01-01","add":{"M":1}} => 2018-02-01
{"date":"2018-01-01","add":{"Y":1}} => 2019-01-01
{"date":"2018-01-30","add":{"M":1}} => 2018-02-28
{"date":"2018-01-30","add":{"M":2}} => 2018-03-30
{"date":"2000-02-29","add":{"Y":1}} => 2001-02-28
{"date":"2000-02-29","add":{"Y":4}} => 2004-02-29
{"date":"2000-01-30","add":{"d":2}} => 2000-02-01
{"date":"2018-01-01","add":{"Y":2,"M":3,"d":4}} => 2020-04-05
{"date":"2018-01-01","add":{"Y":5,"M":15,"d":40}} => 2024-05-11
Puede usar este JSFiddle para realizar pruebas.
Este es el código de golf , por lo que gana la solución más corta (en cada idioma).
y
,m
yd
(por ejemplo, podríad
ser 2147483000?)All inputs and outputs will be within the representable integer range of your language.
Respuestas:
C (gcc) , 291 bytes
Este fue bastante divertido para obtener los mismos valores que el JS incorporado.
Pruébalo en línea!
Sin golf:
Pruébalo en línea!
fuente
perl -MDate :: Calc =: todos -E, 28 bytes
Esto requiere 6 argumentos: el año, mes y fecha de entrada (como argumentos separados) y la cantidad de años, meses y días para agregar.
fuente
perl -MDate::Calc=:all -E '$,=$";say Add_Delta_YMD@ARGV' -- 2000 2 29 1 0 0
regresa en2001 3 1
lugar de lo2001 2 28
que espera el OP (caso de prueba 6).R , 88 bytes
Pruébalo en línea!
Una función que toma 3 argumentos (
Y,M,D
) para la fecha, y otros 3 argumentos (y,m,d
) para que se agreguen los valores.La salida viene con antepuesto
12:00:00 GMT
que es el formato por defecto deISOdate
'sfuente
Perl 6 ,
60 50 4544 bytesPruébelo (60) La
entrada es
( "2000-02-29", year => 1, month => 0, day => 0 )
Pruébelo (50) La
entrada es
( Date.new("2000-02-29"), year => 1, month => 0, day => 0 )
Pruébelo (45) La
entrada es
( Date.new("2000-02-29"), %( year => 1 ) )
(No es necesario incluir claves con un valor de 0)
Pruébelo (44) La
entrada es
( Date.new("2000-02-29"), year => 1 )
Expandido:
fuente
for
C # (.NET Core) , 48 bytes
Pruébalo en línea!
fuente
Java 8, 51 bytes
La entrada (
s
) y la salida son ambasjava.time.LocalDate
.Pruébalo en línea.
Explicación:
fuente
R , 65 bytes
Utiliza el
lubridate
paquete. El%m+%
operador infijo es el azúcar para laadd_with_rollback
función que esencialmente implementa lo que pide la pregunta.TIO no tiene,
lubridate
por lo que puede probarlo aquí en lugar def <-
anteponer a la función anterior junto con casos de prueba:fuente
function(x,y)x%m+%period(y,c("ye","mo","d")) require(lubridate)
(requiere salida de función)Bash ,
150149 bytesPruébalo en línea!
Toma entrada a través de argumentos de línea de comando en orden: año anterior, mes anterior, día anterior. cambio de año, cambio de mes, cambio de día. Emite una cadena como
Wed Feb 28 00:00:00 UTC 2018
stdout.fuente
PHP , 203 bytes
Para ejecutarlo:
Ejemplo:
O Pruébelo en línea!
Pruebas: ¡ Pruébelo en línea!
fuente
T-SQL, 53 bytes
No estoy seguro de que importe, pero estoy aplicando el ajuste Año, seguido del ajuste Mes, seguido del Día. Todos los valores de prueba están disponibles.
Por nuestros estándares IO , de entrada se toma de una preexistente tabla de t con el campo de la fecha una y campos enteros y , m , y d .
Observe de manera interesante que no es la capitalización lo que importa entre los códigos de tipo de fecha ( D , M e Y ) y mis valores de entrada ( d , m e y ) es simplemente el orden de los parámetros en la
DATEADD
función SQL .fuente
2001 3 1
lugar de la2001 2 28
entrada 6.