%U
может возвращать значение от 0 до 53, где каждая неделя определяется как начало в воскресенье. Значения от 1 до 52 имеют смысл, поскольку вы обычно думаете, что год состоит из 52 недель. Итак, давайте рассмотрим ситуации, когда день наступает на неделе 0 или неделе 53.
1 января 2017 года было в воскресенье, поэтому, как и ожидалось, это происходит на неделе 1:
>>> datetime(2017, 1, 1).strftime("%U")
'01'
24 декабря 2017 года - воскресенье, с которого начинается 52 неделя
>>> datetime(2017, 12, 24).strftime("%U")
'52'
Но что же тогда делать с 31 декабря? Очевидно, что в году немного больше , чем 52 недели (поскольку 7 * 52 == 364), поэтому мы рассматриваем неделю, которая «в основном» перетекает в следующий год, как неделю 53.
>>> datetime(2017, 12, 31).strftime("%U")
'53'
Эта неделя совпадает с неделей 0 с точки зрения 2018 г .:
>>> datetime(2018, 1, 1).strftime("%U")
'00'
, поскольку первое воскресенье 2018 г. - 7 января:
>>> datetime(2018, 1, 7).strftime("%U")
'01'
Итак, 53 неделя 2017 и 00 неделя 2018 относятся к одному и тому же промежутку дней с 31 декабря 2017 года по 6 января 2018 года. Мы просто используем разные числа для обозначения этого, в зависимости от того, спрашиваем ли мы об этом как неделя, содержащая день с 2017 года или как неделя с продолжением дней с 2018 года.
Это также означает, что в некоторые годы (например, 2017) нет Недели 0, а в других годах (например, 2016) нет Неделя 53.
>>> datetime(2016, 12, 31).strftime("%U")
'52'
Ни в одном году нет как Недели 0 , так и Недели 53. Но во всех годах недели с 1 по 52 состоят из 7 дней в данном году. Кроме того, если в году есть 53-я неделя, в следующем году будет нулевая неделя.
И, в качестве последнего момента, 53-я неделя обычно начинается 31 декабря. Исключением является високосный год, который начинается в воскресенье, а 53-я неделя начинается 30 декабря. Последним был 2012 год; следующий такой год - 2040.