Python календарь iso 1 января - PullRequest
0 голосов
/ 08 мая 2020

Я использую эту функцию для вычисления номера недели из даты (она считает недели, начиная с 0):

 time.strftime("%U", datetime(2017,1,1).timetuple())

возвращается 1. Если вы попробуете другой год, то есть:

 time.strftime("%U", datetime(2018,1,1).timetuple())

возвращается 0. Отлично, это первая неделя 2018 года.

Совершенно очевидно, что 2017 год начинается с воскресенья, и этот день фактически принадлежит предыдущей неделе: 26 декабря 2016 г. 1 января 2017 г.

Но последняя неделя 2016 года - это номер 52, так почему же функция возвращает 1 вместо 51?

1 Ответ

3 голосов
/ 08 мая 2020

%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.

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