Datetime week number php

Как получить календарную неделю, чувствительную к году? дата («W») возвращает 52 на 1 января

Как говорится в заголовке, функция даты PHP («W») возвращает календарную неделю (для текущего дня). К сожалению, он возвращает 52 или 53 в течение первых дней большинства лет. Это, по простой мысли, правильное, но очень раздражающее, поскольку 1 января 2012 года не календарная неделя 52, это НЕ календарная неделя текущего года. Большинство календарей определяют это как неделю 0 или неделю 52 предыдущего года.

Это очень сложно, когда вы группируете каждый день в году по календарной неделе: 1 января 2012 года и 31 декабря 2012 года выставляются в одну и ту же группу календарных недель.

Поэтому мой вопрос: есть ли (родная) чувствительная к году альтернатива дате PHP («W»)?

EDIT: Я думаю, что я написал первую версию этого вопроса очень неясным образом, так что это мое редактирование: я ищу функцию, которая возвращает правильную неделю календаря в течение первых дней года. Дата PHP («W») возвращает 52 на 1 января 2012 года, что является «неправильным». Он должен быть 0 или null. Согласно официальным источникам, первая календарная неделя года начинается в первый понедельник года. Итак, если первый день года – это не понедельник, это не неделя 1! Это неделя 0. В статье в Википедии говорится:

Читайте также:  Slug php что это

Если 1 января находится в понедельник, вторник, среду или четверг, он находится на неделе 01. Если 1 января находится в пятницу, субботу или воскресенье, это происходит на 52 или 53 неделе предыдущего года.

Это становится сложно, поскольку последние дни года также находятся на неделе 52/53. дата («W») не делит на текущий год и предыдущий год.

Это решение конвертирует избыток декабря в неделю 53 и все в январе до 1-й недели до 0-й.

$w=(int)date('W'); $m=(int)date('n'); $w=$w==1?($m==12?53:1):($w>=51?($m==1?0:$w):$w); echo "week $w in ".date('Y'); 

2013-12-31 ==> неделя 53 в 2013 году

2014-01-01 ==> неделя 1 в 2014 году

2015-12-31 ==> неделя 52 в 2015 году

2016-01-01 ==> неделя 0 в 2016 году

И небольшой тестовый прогон, чтобы вы могли убедиться сами 😉

$id=array(25,26,27,28,29,30,31,1,2,3,4,5,6,7,8); for($iy=2013;$iy<2067;++$iy)$v)else if($k==7)<++$iy;echo '====
';>$tme=strtotime("$im/$v/$iy"); echo date('dm-Y',$tme),' * * '; //THE ACTUAL CODE ================= $w=(int)date('W',$tme); $m=(int)date('n',$tme); $w=$w==1?($m==12?53:1):($w>=51?($m==1?0:$w):$w); //THE ACTUAL CODE ================= echo 'WEEK: ',$w,' --- ','YEAR: ',date('Y',$tme),'
';>--$iy; echo '----------------------------------
';>

Есть ли (родная) чувствительная к году альтернатива дате PHP («W»)?

Согласно официальным источникам, первая календарная неделя года начинается в первый понедельник года.

Я не знаю, какие официальные источники вы имеете в виду.

date(«W») PHP date(«W») возвращает номер недели в соответствии с ISO 8601. Как международный стандарт, ISO 8601 считается одним из, возможно, многих «официальных источников». Если его определение номеров недель не соответствует вашему приложению, вы можете использовать все, что вам нравится.

Если вы используете нестандартное определение «первая неделя года» или используете официальный источник, который не получил широкого признания, ожидайте, что вам придется написать свою собственную функцию для замены date(«W») . (Я уверен, что вам нужно написать функцию.)

Дата 2012-01-01 была в воскресенье. ISO 8601, Wikipedia и php согласны с тем, что номер недели ISO для 2012-01-01 составляет 52.

ISO 8601 не определяет неделю 0.

Итак, если первый день года – это не понедельник, это не неделя 1!

Ни ИСО, ни Википедия не говорят об этом. ISO 8601 определяет неделю номер 1 как неделю, в которой первый четверг в этом году. В 2012 году первый четверг был 5 января, так что номер 1 был с 2 января по 8 января. 2012-01-01 был на последней неделе предыдущего года с точки зрения ISO-недель.

Если вы хотите что-то другое, вы можете играть с арифметикой, делением и т. Д. (Например, попробуйте делить дату («z») на 7.) Или вы можете сохранить эти данные в базе данных и провести недели так, как вам нравится.

Если вы имеете дело с отчетными периодами, я бы почти наверняка сохранил эти данные в таблице в базе данных. Довольно легко создавать такие данные с помощью электронной таблицы.

Текст данных в таблице намного проще проверять, чем текст функции php, независимо от того, насколько проста эта функция. И данные наверняка будут одинаковыми для любой программы, которая обращается к ней, независимо от того, на каком языке она написана. (Итак, если ваша база данных когда-нибудь будет иметь программы, написанные на 5 разных языках, доступ к ней, вам не нужно писать, и поддерживать 5 различных функций, чтобы получить номер недели.)

$d = new DateTime('first monday january '.date('Y')); echo $d->format("W"); 

Есть ли (родная) чувствительная к году альтернатива дате PHP («W»)?

После долгих исследований и обсуждений с разработчиками я нашел это отличное решение и могу ответить на свой вопрос: Пока date(‘W’); вернет 01 с первого января 2013 года, strftime(‘%W’); вернет 00 в тот же день. Это происходит потому, что strftime использует локальную настройку времени [смотрите здесь для получения дополнительной информации].

// both functions need a timestamp [amount of seconds since 1.1.1970], // not a "date" [like 2013-01-01], so we generate a timestamp. By the way, // mktime uses . Month, Day, Year (NOT Day, Month, Year) $timestamp = mktime(0,0,0,1,1,2013); // gives back: 01 echo "Week with date(): "; echo date("W", $timestamp); // gives back: 00 echo "Week with strftime(): "; echo strftime('%W', $timestamp); 

Источник

Week numbers in PHP

To get the ISO week number (1-53) of a date represented by a Unix timestamp, use idate(‘W’, $timestamp ) or strftime(‘%-V’, $timestamp ) .

For a date represented by a DateTime instance, use intval( $dateTime ->format(‘W’)) . Note that format() returns the week number zero-prefixed (e.g. 05), so you need intval to strip the leading zero.

To get the corresponding four-digit year (e.g. 2023), use idate(‘o’, $timestamp ) or strftime(‘%G’, $timestamp ) or $dateTime ->format(‘o’) .

Read more about strftime(), idate() and DateTime::format() in the PHP manual.

How to get the date from a week number

To get the Unix timestamp representing the start of the week (Monday at midnight), use strtotime(sprintf(«%4dW%02d», $year , $week )) .

$year is a 4-digit year (e.g. 2023), and $week is an ISO week number (1-53). The sprintf() call generates a week string in ISO 8601 format, e.g. «2023W01».

To get the start of the week as a DateTime object, use $date = new DateTime(‘midnight’); $date->setISODate( $year , $week );

Read more about strtotime() in the PHP manual.

How to get the number of weeks in a year

To get the number of ISO weeks (i.e. the number of the last week) in a year, use idate(‘W’, mktime(0, 0, 0, 12, 28, $year )) .

This is based on the fact that the last week of the year always includes 28 December.

A lot of software that deal with dates has poor support for week number, in particular the ISO week numbering scheme that is used on this site. The concept of week numbers is virtually unknown in large parts of the world, so adding support for them is not high on the agenda for most software companies. However, with a few tricks it is often possible to make week numbers calculations, even if the application does not have native support for week numbers.

These pages explain how to use week numbers in various popular software applications and programming languages.

Can we use your data to tailor ads for you?

Our partners will collect data and use cookies for ad personalization and measurement.

Источник

Week numbers in PHP

To get the ISO week number (1-53) of a date represented by a Unix timestamp, use idate(‘W’, $timestamp ) or strftime(‘%-V’, $timestamp ) .

For a date represented by a DateTime instance, use intval( $dateTime ->format(‘W’)) . Note that format() returns the week number zero-prefixed (e.g. 05), so you need intval to strip the leading zero.

To get the corresponding four-digit year (e.g. 2023), use idate(‘o’, $timestamp ) or strftime(‘%G’, $timestamp ) or $dateTime ->format(‘o’) .

Read more about strftime(), idate() and DateTime::format() in the PHP manual.

How to get the date from a week number

To get the Unix timestamp representing the start of the week (Monday at midnight), use strtotime(sprintf(«%4dW%02d», $year , $week )) .

$year is a 4-digit year (e.g. 2023), and $week is an ISO week number (1-53). The sprintf() call generates a week string in ISO 8601 format, e.g. «2023W01».

To get the start of the week as a DateTime object, use $date = new DateTime(‘midnight’); $date->setISODate( $year , $week );

Read more about strtotime() in the PHP manual.

How to get the number of weeks in a year

To get the number of ISO weeks (i.e. the number of the last week) in a year, use idate(‘W’, mktime(0, 0, 0, 12, 28, $year )) .

This is based on the fact that the last week of the year always includes 28 December.

A lot of software that deal with dates has poor support for week number, in particular the ISO week numbering scheme that is used on this site. The concept of week numbers is virtually unknown in large parts of the world, so adding support for them is not high on the agenda for most software companies. However, with a few tricks it is often possible to make week numbers calculations, even if the application does not have native support for week numbers.

These pages explain how to use week numbers in various popular software applications and programming languages.

Can we use your data to tailor ads for you?

Our partners will collect data and use cookies for ad personalization and measurement.

Источник

Оцените статью