Dada três inteiros não negativos y
, m
e d
(dos quais pelo menos um deve ser positivo) e uma data válida com um ano positivo (em qualquer formato razoável, que inclui o ano, mês e dia, e nenhuma informação adicional), a saída do data que é y
anos, m
meses e d
dias após a data original.
O calendário gregoriano deve ser usado para todas as datas (mesmo datas anteriores à adoção do calendário gregoriano).
O método para calcular a próxima data é o seguinte:
- Adicionar
y
ao ano - Adicionar
m
ao mês - Normalize a data aplicando rollovers (por exemplo,
2018-13-01
->2019-01-01
) - Se o dia tiver passado o último dia do mês, altere-o para o último dia do mês (por exemplo,
2018-02-30
->2018-02-28
) - Adicionar
d
ao dia - Normalize a data aplicando rollovers (por exemplo,
2019-01-32
->2019-02-01
)
Os anos bissextos (anos divisíveis por 4, mas não divisíveis por 100, a menos que também divisíveis por 400) devem ser tratados adequadamente. Todas as entradas e saídas estarão dentro do intervalo inteiro representável do seu idioma.
Casos de teste
Os casos de teste são fornecidos no formato input => output
, onde input
é um 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
Você pode usar este JSFiddle para teste.
Isso é código-golfe , então a solução mais curta (em cada idioma) vence.
y
,m
ed
(por exemplo, poderiad
ser 2147483000?)All inputs and outputs will be within the representable integer range of your language.
Respostas:
C (gcc) , 291 bytes
Foi muito divertido obter os mesmos valores que o JS embutido.
Experimente online!
Sem golfe:
Experimente online!
fonte
perl -MDate :: Calc =: todos -E, 28 bytes
São necessários 6 argumentos: o ano de entrada, o mês e a data (como argumentos separados) e o número de anos, meses e dias a serem adicionados.
fonte
perl -MDate::Calc=:all -E '$,=$";say Add_Delta_YMD@ARGV' -- 2000 2 29 1 0 0
retorna em2001 3 1
vez de2001 2 28
como o OP espera (caso de teste 6).R , 88 bytes
Experimente online!
Uma função que usa 3 argumentos (
Y,M,D
) para a data e outros 3 argumentos (y,m,d
) para os valores a serem adicionados.A saída vem com anexo,
12:00:00 GMT
que é o formato padrão paraISOdate
osfonte
Perl 6 ,
60 50 4544 bytesTeste (60) A
entrada é
( "2000-02-29", year => 1, month => 0, day => 0 )
Teste (50) A
entrada é
( Date.new("2000-02-29"), year => 1, month => 0, day => 0 )
Teste (45) A
entrada é
( Date.new("2000-02-29"), %( year => 1 ) )
(não é necessário incluir chaves com o valor 0)
Teste (44) A
entrada é
( Date.new("2000-02-29"), year => 1 )
Expandido:
fonte
for
C # (.NET Core) , 48 bytes
Experimente online!
fonte
Java 8, 51 bytes
Input (
s
) e output são ambosjava.time.LocalDate
.Experimente online.
Explicação:
fonte
R , 65 bytes
Usa o
lubridate
pacote. O%m+%
operador infix é o açúcar para aadd_with_rollback
função que implementa essencialmente o que a pergunta pede.O TIO não possui,
lubridate
portanto, você pode tentar aqui em vez disso, comf <-
anexado à função acima junto com os casos de teste:fonte
function(x,y)x%m+%period(y,c("ye","mo","d")) require(lubridate)
(exigem outisde de função)Bash ,
150149 bytesExperimente online!
Recebe entrada por meio de argumentos de linha de comando em ordem: ano antigo, mês antigo, dia antigo. mudança de ano, mudança de mês, mudança de dia. Produz uma string como
Wed Feb 28 00:00:00 UTC 2018
stdout.fonte
PHP , 203 bytes
Para executá-lo:
Exemplo:
Ou Experimente online!
Testes: Experimente online!
fonte
T-SQL, 53 bytes
Não sei se isso importa, mas estou aplicando o ajuste de Ano, seguido pelo mês, seguido pelo dia. Todos os valores de teste são verificados.
De acordo com nossos padrões de IO , a entrada é obtida de uma tabela preexistente t com o campo de data a e o número inteiro y , m , e d .
Observe de maneira interessante que não é a capitalização que importa entre os códigos de tipo de data ( D , M e Y ) e meus valores de entrada ( d , m e y ) é simplesmente a ordem dos parâmetros na
DATEADD
função SQL .fonte
2001 3 1
em vez de2001 2 28
para a entrada de 6.