Учитывая три неотрицательные целые числа y
, m
и d
(из которых по крайней мере один должен быть положительным) и корректную дату с положительным года (в любом подходящем формате , который включает в себя год, месяц и день, и никакой дополнительной информации), выход на дата, то есть y
годы, m
месяцы и d
дни после первоначальной даты.
Григорианский календарь должен использоваться для всех дат (даже дат до принятия Григорианского календаря).
Метод для вычисления следующей даты заключается в следующем:
- Добавить
y
в год - Добавить
m
в месяц - Нормализуйте дату, применяя ролловеры (например
2018-13-01
->2019-01-01
) - Если день больше последнего дня месяца, измените его на последний день месяца (например,
2018-02-30
->2018-02-28
). - Добавить
d
в день - Нормализуйте дату, применяя ролловеры (например
2019-01-32
->2019-02-01
)
Високосные годы (годы, делимые на 4, но не делимые на 100, если не делятся также на 400) должны обрабатываться соответствующим образом. Все входы и выходы будут в пределах представимого целого диапазона вашего языка.
Тестовые случаи
Контрольные примеры предоставляются в формате input => output
, где input
находится объект 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
Вы можете использовать этот JSFiddle для тестирования.
Это Код-гольфпоэтому самое короткое решение (на каждом языке) выигрывает.
y
,m
иd
(например , можетd
быть 2147483000?)All inputs and outputs will be within the representable integer range of your language.
Ответы:
C (gcc) , 291 байт
Это было довольно забавно - возвращать те же значения, что и во встроенной JS.
Попробуйте онлайн!
Un-golfed:
Попробуйте онлайн!
источник
perl -MDate :: Calc =: все -E, 28 байт
Для этого требуется 6 аргументов: введенный год, месяц и дата (как отдельные аргументы) и количество лет, месяцев и дней, которые нужно добавить.
источник
perl -MDate::Calc=:all -E '$,=$";say Add_Delta_YMD@ARGV' -- 2000 2 29 1 0 0
возвращает2001 3 1
вместо того,2001 2 28
что ожидает OP (тестовый пример 6).R , 88 байт
Попробуйте онлайн!
Функция, которая принимает 3 аргумента (
Y,M,D
) для даты и 3 других аргумента (y,m,d
) для значений, которые будут добавлены.Выход поставляется с префиксом ,
12:00:00 GMT
который является форматом по умолчанию дляISOdate
«систочник
Perl 6 ,
60 50 4544 байтовПроверьте , что (60)
вход
( "2000-02-29", year => 1, month => 0, day => 0 )
Проверьте это (50)
Вход
( Date.new("2000-02-29"), year => 1, month => 0, day => 0 )
Проверьте это (45)
Ввод
( Date.new("2000-02-29"), %( year => 1 ) )
(нет необходимости включать ключи со значением 0)
Проверьте это (44)
Вход
( Date.new("2000-02-29"), year => 1 )
Expanded:
источник
for
C # (.NET Core) , 48 байт
Попробуйте онлайн!
источник
Java 8, 51 байт
Вход (
s
) и выход обаjava.time.LocalDate
.Попробуйте онлайн.
Объяснение:
источник
R 65 байт
Использует
lubridate
пакет.%m+%
Оператор инфикса сахар дляadd_with_rollback
функции , которая по существу реализует то , что задает вопрос для.TIO нет,
lubridate
так что вы можете попробовать здесь вместо этого сf <-
добавлением функции выше и тестовых случаев:источник
function(x,y)x%m+%period(y,c("ye","mo","d")) require(lubridate)
(требуется переопределение функции)Баш ,
150149 байтПопробуйте онлайн!
Принимает ввод через аргументы командной строки в следующем порядке: старый год, старый месяц, старый день. смена года, смена месяца, смена дня. Выводит строку типа
Wed Feb 28 00:00:00 UTC 2018
stdout.источник
PHP , 203 байта
Чтобы запустить это:
Пример:
Или попробуйте онлайн!
Тесты: попробуйте онлайн!
источник
T-SQL, 53 байта
Я не уверен, что это имеет значение, но я применяю корректировку года, затем корректировку месяца и день. Все тестовые значения проверены.
В соответствии с нашими стандартами ввода- вывода входные данные берутся из уже существующей таблицы t с полем даты a и целочисленными полями y , m и d .
Интересно отметить, что между кодами типа даты ( D , M и Y ) и моими входными значениями ( d , m и y ) важна не прописная буква , а просто порядок параметров в
DATEADD
функции SQL .источник
2001 3 1
вместо2001 2 28
ввода 6.