Не удалось найти начало 53-й недели, используя метод Date.commercial - PullRequest
0 голосов
/ 08 июня 2018

Date.commercial метод определения начала недели (понедельник) не работает в течение 53-й недели

Date.commercial(2018, 1, 1)
#=> 2018-01-01
Date.commercial(2018, 52, 1)
#=> 2018-12-24

Выдает ошибку, когда я пытаюсь найти понедельник 53-й недели в годах, в которых есть 53 недели.

Date.commercial(2018, 53, 1)
# ArgumentError: invalid date

Кроме того, его определение мне тоже не понятно.Как то, как эти двое ведут себя так по-разному:

Date.commercial(2015, 1, 1)
#=> 2014-12-29

Date.commercial(2016, 1, 1)
#=> 2016-01-04

Я думаю, это потому, что определение Date.commercial() для преобразования номера недели в дату отличается от определения Date.strftime("%W").Существует ли какой-либо метод, который может преобразовать номер недели в году в дату недели понедельника, соответствующую Date.strftime("%W"), то есть обратная функция Date.strftime("%W")?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Существует ли какой-либо метод, который может преобразовать номер недели в году в дату недели понедельника, соответствующую Date.strftime("%W"), то есть обратная функция Date.strftime("%W")?

Вы можете использовать strptime:

Date.strptime('2018-W53', '%Y-W%W')
#=> #<Date: 2018-12-31 ((2458484j,0s,0n),+0s,2299161j)>

Обратите внимание, что %W и %V (коммерческая неделя) определены по-разному и дают разные результаты.

%W определяется как:

1-я неделя ГГГГ начинается с понедельника.Дни в году, предшествующем первой неделе, относятся к неделе 0.

%V определяется как:

Неделя 1 YYYY начинается с понедельника и включает в себяYYYY-01-04.Дни в году до первой недели относятся к последней неделе предыдущего года.

Некоторые примеры:

Date.new(2018,  1,  1).strftime('%Y-W%W / %G-CW%V') #=> "2018-W01 / 2018-CW01"
Date.new(2018, 12, 31).strftime('%Y-W%W / %G-CW%V') #=> "2018-W53 / 2019-CW01"

Date.new(2019,  1,  1).strftime('%Y-W%W / %G-CW%V') #=> "2019-W00 / 2019-CW01"
Date.new(2019, 12, 31).strftime('%Y-W%W / %G-CW%V') #=> "2019-W52 / 2020-CW01"

Date.new(2020,  1,  1).strftime('%Y-W%W / %G-CW%V') #=> "2020-W00 / 2020-CW01"
Date.new(2020, 12, 31).strftime('%Y-W%W / %G-CW%V') #=> "2020-W52 / 2020-CW53"

Date.new(2021,  1,  1).strftime('%Y-W%W / %G-CW%V') #=> "2021-W00 / 2020-CW53"
Date.new(2021, 12, 31).strftime('%Y-W%W / %G-CW%V') #=> "2021-W52 / 2021-CW52"
0 голосов
/ 08 июня 2018

Из документов API:

первая календарная неделя года включает в себя первый четверг этого года.В григорианском календаре это эквивалентно неделе, которая включает 4 января.

Таким образом, 2018 не имеет 53 недели.Последний день последней недели 2018 года:

Date.commercial(2018, 52, 7)
# => #<Date: 2018-12-30 ((2458483j,0s,0n),+0s,2299161j)> 

, за которым следует первая неделя 2019 года:

Date.commercial(2019, 1, 1)
# => #<Date: 2018-12-31 ((2458484j,0s,0n),+0s,2299161j)> 

Похоже, вы работаете в предположении, что 2018-12-31 в 2018. Это не, не в коммерческую дату.Если вы собираетесь использовать коммерческий год вместо календарного года, используйте %G, а не %Y, чтобы получить коммерческий год, и %V для недели вместо %W.

date2018_12_31 = Date.commercial(2019, 1, 1)
date2018_12_31.strftime("%Y %W")                  # WRONG
# => "2018 53"
date2018_12_31.strftime("%G %V")                  # CORRECT
# => "2019 01"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...