Ошибка в `Date # strtime`?Он разбирает дни, которые больше 30/31 в месяц, путая их с годами - PullRequest
0 голосов
/ 14 июня 2019

Почему строка даты с определенным форматом успешно анализируется методом strptime с явно другим форматом?

необходимо явно принять дату формата для API

$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
$ irb
irb(main):001:0> require 'date'
=> true
irb(main):002:0> Date.strptime('01-01-1970', '%Y-%m-%d')
=> #<Date: 0001-01-19 ((1721442j,0s,0n),+0s,2299161j)>
irb(main):003:0> Date.strptime('01-01-1970', '%Y-%m-%d').to_s
=> "0001-01-19"
irb(main):004:0> Date.strptime('01-01-1970', '%Y-%m-%d').year
=> 1
irb(main):005:0> Date.strptime('01-01-1970', '%Y-%m-%d').day
=> 19

Ожидайте:тест пройден

it 'raises an exception when wrong format' do
 expect { Date.strptime('01-01-1970', '%Y-%m-%d') }.to raise_exception(ArgumentError, 'invalid format')
end

Фактический: expected ArgumentError with "invalid format" but nothing was raised

1 Ответ

7 голосов
/ 14 июня 2019

Думаю, у вас есть два скрытых вопроса.

Почему 01 является действительным соответствием для %Y (что означает "год, включая век")

Потому что зачем считать 4 цифры годами?В противном случае вы не сможете указать 3-значные годы (например, 882 год был, когда Киев стал столицей Руси).Или, может быть, в этом случае вы имели средний год 1. Руби понятия не имеет.

Почему 1970 соответствует %d?

Потому что так работает strptime(3) (с которым он должен быть совместим).Как только дескриптор формата %d ("день, 1-31") удовлетворяется с 19, строка перестает обрабатываться.

Возвращаемое значение функции - указатель на первый символне обрабатывается в этом вызове функции.Если во входной строке содержится больше символов, чем требуется для строки формата, возвращаемое значение указывает сразу после последнего использованного входного символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...