ISO 8601 week number to date (timestamp) in PHP
64 Comments so far
Leave a comment
How do I convert an ISO 8601 week number to a timestamp or date?
Here’s a handy function for PHP that returns an array with seven timestamps, one for each day in week $weekNumber.
function getDaysInWeek ($weekNumber, $year) {
// Count from '0104' because January 4th is always in week 1
// (according to ISO 8601).
$time = strtotime($year . '0104 +' . ($weekNumber - 1)
. ' weeks');
// Get the time of the first day of the week
$mondayTime = strtotime('-' . (date('w', $time) - 1) . ' days',
$time);
// Get the times of days 0 -> 6
$dayTimes = array ();
for ($i = 0; $i < 7; ++$i) {
$dayTimes[] = strtotime('+' . $i . ' days', $mondayTime);
}
// Return timestamps for mon-sun.
return $dayTimes;
}
A simple way to test if it works:
$dayTimes = getDaysInWeek(33, 2006);
foreach ($dayTimes as $dayTime) {
echo (strftime('%a %Y%m%d', $dayTime) . "n");
}
I had some trouble with making this work on my local computer. A good guess is that this has something to do with my locales, so beware! Run the test on the computer that hosts your application before you rely on it.
64 Comments so far
Leave a comment
Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Thank you, just what I needed, good tip about using strtotime to make these calculations!
I had to change the string used by strtotime to “4 January 2006 + 33 weeks” to make it work for me, probably locale settings.
Comment by Rune August 16, 2006 @ 1:01 pmperfect. thank you very much.
Comment by safeen August 23, 2006 @ 11:44 amThis always works:
function getFirstDayOfWeek($year, $weeknr)
Comment by Patrick Nijs January 10, 2007 @ 2:48 pm{
$offset = date(’w', mktime(0,0,0,1,1,$year));
$offset = ($offset
Again, in valid HTML:
function getFirstDayOfWeek($year, $weeknr)
{
$offset = date(’w', mktime(0,0,0,1,1,$year));
$offset = ($offset < 5) ? 1-$offset : 8-$offset;
$monday = mktime(0,0,0,1,1+$offset,$year);
return strtotime(’+’ . ($weeknr – 1) . ‘ weeks’, $monday);
Comment by Patrick Nijs January 10, 2007 @ 2:50 pm}
Brilliant!
Comment by Dandelion January 15, 2007 @ 11:18 pmWhat does Rune mean by “I had to change the string used by strtotime to “4 January 2006 + 33 weeks” to make it work for me, probably locale settings.”
Comment by Rajan August 2, 2007 @ 9:50 amThat instead of using:
$time = strtotime($year . '0104 +' . ($weekNumber - 1) . ' weeks');
He had to use:
Comment by tzzz August 2, 2007 @ 10:48 am$time = strtotime('4 January ' . $year . ' +' . ($weekNumber - 1) . ' weeks');
@Patrick Nijs… This is just what I was looking for! Thanks
Comment by batfastad October 10, 2007 @ 3:20 pmHere is another way to do it:
Comment by John December 31, 2007 @ 8:41 pm$date = date(’m/d/Y’, strtotime(’1 january 2007 + 33 weeks’));
Also,
$date = date(’m/d/Y’, strtotime(’2007W011′));
Where:
Comment by John December 31, 2007 @ 9:00 pm2007 = year
W01 = week one (W04 = week 4, etc)
1 = day of week to get date for (in this case, monday)
or u can try this function
function getDaysInWeek ($weekNumber, $year)
Comment by gigel January 23, 2008 @ 12:22 pm{
$date_object = date_create( “0 January $year” );
$date_object->modify( “+$weekNumber weeks” );
$dayTimes = $date_object->format( “d-m-Y” );
$date_object->modify( “-6 days” );
$dayTimes = $date_object->format( “d-m-Y” ).” – “.$dayTimes;
return $dayTimes;
}
KISS solution based on Johns entry:
/**
* Get the start of a given week (in this case monday is first day = W)
*
* @param integer $iWeekNumber
* @param string $sFormat
* @param integer $iYear
* @return mixed Datetime or UNIX time depending on format
*/
public static function getDatetimeWeekStart( $iWeekNumber, $iYear = null, $sFormat = ‘d\.m\.Y’)
{
if ( is_null($iYear) ) $iYear = date(”Y”);
if ( $iWeekNumber < 10 ) $iWeekNumber = “0″.$iWeekNumber;
$iTime = strtotime($iYear.’W’.$iWeekNumber);
return date($sFormat, $iTime);
}
Example this week:
print getDatetimeWeekStart(date(’W'));
Example week 10 in 2006:
print getDatetimeWeekStart(10, 2006);
Example week 52 in 2009 in unixtime:
print getDatetimeWeekStart(52, 2009, ‘U’);
Best regards
Comment by HorsMark March 14, 2008 @ 9:06 amJesper HorsMark
[...] return $dayTimes; } aus: ISO 8601 week number to date (timestamp) in PHP Er gibt dir einen Array mit 7 Eintrgen zurck, fr jeden Tag einen. Davon brauchst du eben nur [...]
Pingback by Erster Tag einer Woche - PHP @ tutorials.de: Forum, Tutorial, Anleitung, Schulung & Hilfe April 4, 2008 @ 12:26 pmPatrick Nijs’s code does not work every time. For example, year 2008, week number 1
Comment by Jasmo July 28, 2008 @ 11:54 amWeek 1 starts in last year, 31.12.2007 to be exact. Patrick’s code does not understand that and says that first day of the first week is 1.1.2008.
Very useful for me, just what i wanted.
Comment by centerax September 15, 2008 @ 9:29 pmThanks!
[...] So, i searched on google and found this as first result: http://tzzz.wordpress.com/2006/08/14/8/ [...]
Pingback by Get timestamps out of week no. and year. | Rene's PHP Blog October 23, 2008 @ 10:49 amThanks for the code! It was very usefull.
I posted someting on my blog to show you how i used it. And a backlink to this blogpost!
Comment by Rene October 23, 2008 @ 10:52 amAlso for week 53 year 2009 and week 1 year 2010…
Comment by nkonx October 29, 2008 @ 9:46 amfunction week2date($year, $week, $weekday=7) {
Comment by Ramsed November 21, 2008 @ 9:53 pm$time = mktime(0, 0, 0, 1, (4 + ($week-1)*7), $year);
$this_weekday = date(”N”, $time);
return mktime(0, 0, 0, 1, (4 + ($week-1) * 7 + ($weekday – $this_weekday)), $year);
}
“Очень познавательно. Спасибо.”
Comment by Жора December 6, 2008 @ 2:45 pmI would be so happy if anyone could help me.
This scripts belives that there’s 53 weeks in year 2008
it’s only 52 ofc. så week 1 in 2009 is week 2 IRL.
and week 2 is week 3 and so on. Why does this occur? i’ve tryed to solve it. but i cant :’(
PLEASE!! COntact me @ patrik@quick-bemanning.se
Comment by Patrik December 13, 2008 @ 3:12 amI would be so greatfull for any solution!
Благодарю!!!У Вас часто появляются очень интересные посты! Очень поднимаете мое настроение.
Comment by FekEageree December 19, 2008 @ 12:13 pmОчень понравилось, даже не ожидала.
Comment by BemeTeraroma December 19, 2008 @ 1:12 pmЦенные рекомендации, беру на заметку
Comment by BemeTeraroma December 19, 2008 @ 2:30 pmмило ждем еще…
Comment by riggautt December 19, 2008 @ 2:55 pmОгромное вам человеческое спасибо, очень актуальная заметка.
Comment by hikafe December 19, 2008 @ 3:21 pmочень занимательно было почитать
Comment by troniult December 19, 2008 @ 4:13 pmОгромное человеческое спасбо!
Comment by dadnenselomo December 19, 2008 @ 6:16 pmБлагодарю!!!У Вас часто появляются очень интересные посты! Очень поднимаете мое настроение.
Comment by Preatteptgab December 20, 2008 @ 9:57 amНеплохой пост, но много лишнего.
Comment by Embemo December 20, 2008 @ 11:47 amLoved this, thans a lot
.
Comment by Severo December 23, 2008 @ 6:58 pmFixed the years with 29 february
Comment by Juan Guzman December 30, 2008 @ 4:53 pmif (($year -1)/ 4 == intval(($year -1)/ 4)) $time = $time – 172800;
Leap year fix in previous comment unfortunately doesn’t really work in my script … I did, however, manage to fix the problem temporarily by writing ‘1 January’ instead of ‘4 January’. Will be re-set again for 2010 and following years. thx!
Comment by ahhoi January 2, 2009 @ 9:35 pmI’ve try this script and for unfortunately concidence, this year the 20090104 is sunday.
Comment by Alessandro bellisai January 6, 2009 @ 12:17 amSo the script fail to calculate $mondayTime = strtotime(’– 1 days’, $time); don’t work!
This is the fix
if ((date(”w”, $time) == 0))
{
$mondayTime = strtotime(”-6 days”, $time);
}
else
{
$mondayTime = strtotime(”-” . (date(”w”, $time) – 1) . ” days”, $time);
}
“Блог в ридер однозначно”
Comment by Бэк January 9, 2009 @ 1:17 pmА газовый конфликт не окончен, а Вы тут всё о своём трёте
Comment by Valert January 29, 2009 @ 8:23 amBrand Cialis, Vprx Oil, Brand Levitra and Cardura. The Internet a drugstore of medicines for your health. For sexual pleasure new preparations checked up, For mens and womens the intimate means raising a sexual inclination
Comment by Max February 21, 2009 @ 6:44 pmИнтересная статья
Comment by Dyuha February 28, 2009 @ 8:26 amАргументы, убедительность аргуметов, правила убеждения. Аргументы собеседника. Боритесь с возражениями в любой форме и понять собеседника – основная цель
Comment by Валенитина March 1, 2009 @ 7:34 pmРабота, менеджмент и коллектив. Как вести себя у шефа, что бы избежать неприятностей. Правила ведение деловой беседы, пантомимика в беседе
Comment by Сюзанна March 3, 2009 @ 7:03 pmОткрыть учебный торгорвый счет и скачать терминал. Условия торговли на рынке forex – советы и решения и обучение торговли на валютном рынке форекс. Финансовые новости
Comment by Татьяна March 8, 2009 @ 6:04 pmϻСлушай, а я смотрю у тебя спамеров нет совсем. Достали спамеры! :заразой этой борешься? Не подскажешь плагин какой?
Comment by Balmiko March 11, 2009 @ 2:57 pmСекс видео – лучшие секс и порно ролики. Неограниченный доступ в течении месяца к секс фильмам. Красивый секс в фильмах
Comment by Алена March 14, 2009 @ 11:07 amПрикольно
Comment by SAD_rus March 14, 2009 @ 1:12 pmJohn’s solutions (and thus HorsMark’s KISS one) won’t work because
Comment by Janis March 23, 2009 @ 9:24 am1) in the first case it won’t be the Monday of the given week;
2) the second case needs ISO weeknumber year for the input not the usual Gregorian year (which is the case).
На данном веб-сайте вы можете заказать базу белых каталогов сайтов.
Comment by Gigawlribra March 26, 2009 @ 12:40 amБелые каталоги сайтов
Уважаемый автор блога, а вы случайно не из Москвы?
Comment by cheappower April 13, 2009 @ 4:32 amhm. bookmarked )
Comment by crydaymak April 22, 2009 @ 2:06 pmНапиши подробней в icq 433505474. Есть кое-что по твоему вопросу.
Comment by Rust May 1, 2009 @ 10:26 pmЯ извиняюсь, что немного не в тему, а что такое RSS? и ка на него подписаться?
Comment by Squallthoumma May 2, 2009 @ 5:18 pmС праздничками всех, между прочим!
Comment by Photoshop May 4, 2009 @ 6:21 amПочему этот вебсайт не имейте другую поддержку языков?
Comment by Apattrierseri May 5, 2009 @ 8:23 pmДобавил в свои закладки. Теперь буду вас намного почаще читать!
Comment by Bidsninue May 6, 2009 @ 9:02 amХотя я уже и читал подобные посты, но не дает мне это покоя. Спасибо за пост.
Comment by bosageb May 13, 2009 @ 6:49 pmОчень интересно. Но чего-то не хватает. Может быть, стоит добавить каких-нибудь картинок или фото?
Comment by wehygam May 14, 2009 @ 8:54 pmДобавил в свои закладки. Теперь буду вас намного почаще читать!
Comment by wechate May 14, 2009 @ 11:46 pmНаткнулся случайно на Ваш блог. Теперь стану постоянно просматривать. Надеюсь, не разочаруете и дальше
Comment by komamoc May 15, 2009 @ 1:34 pmTPL
Comment by Иван May 21, 2009 @ 2:23 pmВсе отлично, но вот у любого блога постоянная проблема с трансляцией rss! Хотелось бы и с коментами получать. Но нет. Это вообще решаемо?
Comment by xyebony May 25, 2009 @ 10:03 amОгромное вам человеческое спасибо, очень актуальная заметка.
Comment by gosahot May 25, 2009 @ 12:15 pmОчень интересно. Но чего-то не хватает. Может быть, стоит добавить каких-нибудь картинок или фото?
Comment by jepukuq May 25, 2009 @ 3:15 pmСпасибо. Уже не первый раз по делу пишете!)
Comment by rylocul May 25, 2009 @ 4:08 pmVery interest. Thx
Comment by титаны возрождения June 7, 2009 @ 1:21 amI think nobody noticed one mistake in the code…
$mondayTime = strtotime(’-’ . (date(’w', $time) – 1) . ‘ days’, $time);
Which is totally wrong, according to PHP.net. If we handle weeks in ISO 8601 format, we have to do the same, according to days, arn’t we?
We have to use date(’N') to handle days in ISO format, instead of date(’w')…
So it should be:
$mondayTime = strtotime(’-’ . (date(’N', $time) – 1) . ‘ days’, $time);
Comment by DjZoNe July 3, 2009 @ 12:42 pm