Mengingat tiga bilangan bulat non-negatif y
, m
dan d
(yang setidaknya satu harus positif) dan tanggal yang valid dengan tahun positif (dalam format yang wajar yang mencakup tahun, bulan, hari, dan tidak ada informasi tambahan), output tanggal yaitu y
tahun, m
bulan, dan d
hari setelah tanggal asli.
Kalender Gregorian harus digunakan untuk semua tanggal (bahkan tanggal sebelum adopsi kalender Gregorian).
Metode untuk menghitung tanggal berikutnya adalah sebagai berikut:
- Tambahkan
y
ke tahun - Tambahkan
m
ke bulan - Normalisasi tanggal dengan menerapkan rollover (mis
2018-13-01
- -2019-01-01
) - Jika hari itu melewati hari terakhir bulan itu, ubah hari itu menjadi hari terakhir di bulan itu (mis.
2018-02-30
->2018-02-28
) - Tambahkan
d
ke hari itu - Normalisasi tanggal dengan menerapkan rollover (mis
2019-01-32
- -2019-02-01
)
Tahun kabisat (tahun habis dibagi 4, tetapi tidak habis dibagi 100 kecuali juga habis dibagi 400) harus ditangani dengan tepat. Semua input dan output akan berada dalam kisaran integer yang dapat diwakili dari bahasa Anda.
Uji Kasus
Test case disediakan dalam format input => output
, di mana input
objek 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
Anda dapat menggunakan JSFiddle ini untuk pengujian.
Ini adalah kode-golf , jadi solusi terpendek (dalam setiap bahasa) menang.
y
,m
dand
(misalnya bisad
2147483000?)All inputs and outputs will be within the representable integer range of your language.
Jawaban:
C (gcc) , 291 byte
Yang ini cukup menyenangkan untuk mendapatkan kembali nilai yang sama dengan JS builtin.
Cobalah online!
Tidak golf:
Cobalah online!
sumber
perl -MDate :: Calc =: semua -E, 28 byte
Ini membutuhkan 6 argumen: tahun input, bulan dan tanggal (sebagai argumen terpisah), dan jumlah tahun, bulan dan hari untuk ditambahkan.
sumber
perl -MDate::Calc=:all -E '$,=$";say Add_Delta_YMD@ARGV' -- 2000 2 29 1 0 0
mengembalikan2001 3 1
bukan2001 2 28
seperti yang diharapkan OP (kasus uji 6).R , 88 byte
Cobalah online!
Fungsi yang mengambil 3 argumen (
Y,M,D
) untuk tanggal, dan 3 argumen lainnya (y,m,d
) untuk nilai yang akan ditambahkan.Output dilengkapi dengan dibubuhkan di awal
12:00:00 GMT
yang merupakan format default untukISOdate
'ssumber
Perl 6 ,
60 50 4544 byteUji (60)
inputnya
( "2000-02-29", year => 1, month => 0, day => 0 )
Uji (50)
inputnya
( Date.new("2000-02-29"), year => 1, month => 0, day => 0 )
Mengujinya (45)
Inputnya adalah
( Date.new("2000-02-29"), %( year => 1 ) )
(Tidak perlu memasukkan kunci dengan nilai 0)
Uji (44)
Inputnya adalah
( Date.new("2000-02-29"), year => 1 )
Diperluas:
sumber
for
C # (.NET Core) , 48 byte
Cobalah online!
sumber
Java 8, 51 byte
Input (
s
) dan output keduanyajava.time.LocalDate
.Cobalah online.
Penjelasan:
sumber
R , 65 byte
Menggunakan
lubridate
paket. The%m+%
Operator infiks adalah gula untukadd_with_rollback
fungsi yang pada dasarnya mengimplementasikan apa pertanyaan meminta.TIO tidak memiliki
lubridate
sehingga Anda dapat Coba Di Sini Sebagai gantinya denganf <-
ditambahkan ke fungsi di atas bersama dengan kasus uji:sumber
function(x,y)x%m+%period(y,c("ye","mo","d")) require(lubridate)
(memerlukan outisde of function)Bash ,
150149 byteCobalah online!
Mengambil input melalui argumen baris perintah secara berurutan: tahun tua, bulan tua, hari tua. perubahan tahun, perubahan bulan, perubahan hari. Menghasilkan string seperti
Wed Feb 28 00:00:00 UTC 2018
ke stdout.sumber
PHP , 203 byte
Untuk menjalankannya:
Contoh:
Atau Coba online!
Tes: Coba online!
sumber
T-SQL, 53 Bytes
Saya tidak yakin itu penting, tapi saya menerapkan penyesuaian Tahun, diikuti oleh penyesuaian Bulan, diikuti oleh Hari. Semua nilai tes dicoba.
Sesuai standar IO kami , input diambil dari tabel t yang sudah ada dengan bidang tanggal a dan bidang bilangan bulat y , m , dan d .
Perhatikan dengan menarik bahwa itu bukan huruf besar yang penting antara kode tipe tanggal ( D , M , dan Y ) dan nilai input saya ( d , m , dan y ) hanya urutan parameter dalam
DATEADD
fungsi SQL .sumber
2001 3 1
alih-alih2001 2 28
untuk input 6.