Re: [PHP] Calendar/Date
Weeks in a year is 52 or 53 Days in a year is 365 and if a leap year 366 If ( (365 (Days Of a year) * (Years From 1940)) + (Number of leap years since 1940, (Years From 1940 / 4) (if its a Leap year -1)) + ((Days >From 01-01) + 1) % 7 = (0-6 where 0 = Monday) ) is less then 3 (Thursday) then its in week nr 01 else if equal to 4 (Friday) its week 53 else its week 52 http://threesides.kronan-net.com/2008/08/04/date-calculation-algorithm/ -- MvH / Hans Åhlin - www.kronan-net.com -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Calendar/Date
On Wed, Mar 18, 2009 at 12:57:39PM -0400, Bob McConnell wrote: > From: Paul M Foster > > On Wed, Mar 18, 2009 at 11:46:31AM -0400, Bob McConnell wrote: > >> > >>> You also need to be aware that on 32 bit Unix and Linux systems the > >> behavior of mktime() on dates after Jan 18, 2038 is undefined. The 32 > >> bit counter overflows early on the 19th, so any value returned is > >> invalid. This is not a problem on 64 bit systems. > >> > >> We ran into this recently because Support was defining "never expire" > as > >> Today plus 30 years. A couple of sites started reporting problems > about > >> two months ago. > > > > This is why I normally never use the time functions in PHP. Instead, I > > wrote a date class that uses Julian days internally and doesn't > consult > > PHP time functions. When I need some odd thing (like the date for the > > end of the week), I just add it as a member to the date class. Plus, > > PHP's date objects are woefully unfeatureful. If someone asks on the > > list for a solution, I can use the PHP time functions for advising > them, > > but I don't personally use them. > > Unfortunately, this code was initially inherited from another project > and already had mktime() based date calculations throughout (in 19 of > 162 files). I'm the fourth programmer to work with this project and now > have to correct these problems. There are several other programmers who > have to correct it in their projects as well. None of us wrote the > original code, so we are all in the same boat. No matter what we want, > we can't just replace code wholesale because of the testing overhead and > other task priorities. We can only fix it after it becomes recognized as > a problem. I feel your pain. Been there, done that. T-shirt in drawer. > > The other issue is that I don't do OOP. After 30 years of writing > procedural code, mostly assembler, PL/M and C, I simply don't see the > point of OO, nor can I justify the additional overhead. I have written > functions that others converted into methods, and occasionally re-use > functions that were written as methods, but have never used a whole > class. > You know, I'm gonna start a programmer blog to talk about things like this (as soon as I finish the blog software, in progress now). I'm sympathetic. I also come from a procedural background, and frankly don't see that the OO hype has lived up to its promise. I see two reasons to use OO under select circumstances: First, namespaces. The more routines you have in a given program, the more likely you are to have function name collisions. OO helps with that. The other thing that comes to mind is that objects can have embedded value members which get shared between the various class methods. Meaning I don't have the overhead and hassle of having to pass those values around to all the functions involved. I don't know that objects have any noticeable overhead versus functions. But I'm pretty judicious about the use of objects-- only if that's the "best" solution for a given problem (best in *my* opinion). Paul -- Paul M. Foster -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
RE: [PHP] Calendar/Date
From: Paul M Foster > On Wed, Mar 18, 2009 at 11:46:31AM -0400, Bob McConnell wrote: >> >>> You also need to be aware that on 32 bit Unix and Linux systems the >> behavior of mktime() on dates after Jan 18, 2038 is undefined. The 32 >> bit counter overflows early on the 19th, so any value returned is >> invalid. This is not a problem on 64 bit systems. >> >> We ran into this recently because Support was defining "never expire" as >> Today plus 30 years. A couple of sites started reporting problems about >> two months ago. > > This is why I normally never use the time functions in PHP. Instead, I > wrote a date class that uses Julian days internally and doesn't consult > PHP time functions. When I need some odd thing (like the date for the > end of the week), I just add it as a member to the date class. Plus, > PHP's date objects are woefully unfeatureful. If someone asks on the > list for a solution, I can use the PHP time functions for advising them, > but I don't personally use them. Unfortunately, this code was initially inherited from another project and already had mktime() based date calculations throughout (in 19 of 162 files). I'm the fourth programmer to work with this project and now have to correct these problems. There are several other programmers who have to correct it in their projects as well. None of us wrote the original code, so we are all in the same boat. No matter what we want, we can't just replace code wholesale because of the testing overhead and other task priorities. We can only fix it after it becomes recognized as a problem. The other issue is that I don't do OOP. After 30 years of writing procedural code, mostly assembler, PL/M and C, I simply don't see the point of OO, nor can I justify the additional overhead. I have written functions that others converted into methods, and occasionally re-use functions that were written as methods, but have never used a whole class. Bob McConnell -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Calendar/Date
On Wed, Mar 18, 2009 at 11:46:31AM -0400, Bob McConnell wrote: > From: Paul M Foster > > You also need to be aware that on 32 bit Unix and Linux systems the > behavior of mktime() on dates after Jan 18, 2038 is undefined. The 32 > bit counter overflows early on the 19th, so any value returned is > invalid. This is not a problem on 64 bit systems. > > We ran into this recently because Support was defining "never expire" as > Today plus 30 years. A couple of sites started reporting problems about > two months ago. This is why I normally never use the time functions in PHP. Instead, I wrote a date class that uses Julian days internally and doesn't consult PHP time functions. When I need some odd thing (like the date for the end of the week), I just add it as a member to the date class. Plus, PHP's date objects are woefully unfeatureful. If someone asks on the list for a solution, I can use the PHP time functions for advising them, but I don't personally use them. Paul -- Paul M. Foster -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
RE: [PHP] Calendar/Date
On Wed, 2009-03-18 at 11:46 -0400, Bob McConnell wrote: > From: Paul M Foster > > On Tue, Mar 17, 2009 at 08:52:11PM -0700, Jason Todd Slack-Moehrle > wrote: > > > >> Hi All, > >> > >> Does anyone have code and/or advice for how to get get the current > >> week (with a passed current day, say) and what then end date is at > >> Saturday. > >> > >> So take today: Tuesday March 17, 2009 > >> > >> I want to get: > >> Sunday March 15, 2009 > >> Monday March 16, 2009 > >> Tuesday March 17, 2009 > >> Wednesday March 18, 2009 > >> Thursday March 19, 2009 > >> Friday March 20, 2009 > >> Saturday March 21, 2009 > > > > I just answered a question similar to this. You might check the > > archives. In this case, you'll need to use the getdate() function (see > > php.net/manual/en/ for details) to get the array of values for today > > (like the day of the month, month number, year, etc.). The getdate() > > function returns an array, one of whose members is 'wday', which is > the > > day of the week, starting with 0 for Sunday. Use that number to > > determine how many days to go back from today. Then use mktime() to > get > > the timestamps for each day in turn. You feed mktime() values from the > > getdate() call. Then you can use strftime() or something else to print > > out the dates in whatever format, given the timestamps you got. > > > > Be careful in feeding values to mktime(). If your week spans a > > month or year boundary, you'll need to compensate for it when giving > > mktime() month numbers, day numbers and year numbers. > > You also need to be aware that on 32 bit Unix and Linux systems the > behavior of mktime() on dates after Jan 18, 2038 is undefined. The 32 > bit counter overflows early on the 19th, so any value returned is > invalid. This is not a problem on 64 bit systems. > > We ran into this recently because Support was defining "never expire" as > Today plus 30 years. A couple of sites started reporting problems about > two months ago. But the solution doesn't even require mktime(). Cheers, Rob. -- http://www.interjinn.com Application and Templating Framework for PHP -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
RE: [PHP] Calendar/Date
From: Paul M Foster > On Tue, Mar 17, 2009 at 08:52:11PM -0700, Jason Todd Slack-Moehrle wrote: > >> Hi All, >> >> Does anyone have code and/or advice for how to get get the current >> week (with a passed current day, say) and what then end date is at >> Saturday. >> >> So take today: Tuesday March 17, 2009 >> >> I want to get: >> Sunday March 15, 2009 >> Monday March 16, 2009 >> Tuesday March 17, 2009 >> Wednesday March 18, 2009 >> Thursday March 19, 2009 >> Friday March 20, 2009 >> Saturday March 21, 2009 > > I just answered a question similar to this. You might check the > archives. In this case, you'll need to use the getdate() function (see > php.net/manual/en/ for details) to get the array of values for today > (like the day of the month, month number, year, etc.). The getdate() > function returns an array, one of whose members is 'wday', which is the > day of the week, starting with 0 for Sunday. Use that number to > determine how many days to go back from today. Then use mktime() to get > the timestamps for each day in turn. You feed mktime() values from the > getdate() call. Then you can use strftime() or something else to print > out the dates in whatever format, given the timestamps you got. > > Be careful in feeding values to mktime(). If your week spans a > month or year boundary, you'll need to compensate for it when giving > mktime() month numbers, day numbers and year numbers. You also need to be aware that on 32 bit Unix and Linux systems the behavior of mktime() on dates after Jan 18, 2038 is undefined. The 32 bit counter overflows early on the 19th, so any value returned is invalid. This is not a problem on 64 bit systems. We ran into this recently because Support was defining "never expire" as Today plus 30 years. A couple of sites started reporting problems about two months ago. Bob McConnell -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Calendar/Date
On Tue, 2009-03-17 at 20:52 -0700, Jason Todd Slack-Moehrle wrote: > Hi All, > > Does anyone have code and/or advice for how to get get the current > week (with a passed current day, say) and what then end date is at > Saturday. > > So take today: Tuesday March 17, 2009 > > I want to get: > Sunday March 15, 2009 > Monday March 16, 2009 > Tuesday March 17, 2009 > Wednesday March 18, 2009 > Thursday March 19, 2009 > Friday March 20, 2009 > Saturday March 21, 2009 A sprinkle of math + a sprinkle of time + a sprinkle of PHP: Cheers, Rob. -- http://www.interjinn.com Application and Templating Framework for PHP -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Calendar/Date
On Tue, Mar 17, 2009 at 08:52:11PM -0700, Jason Todd Slack-Moehrle wrote: > Hi All, > > Does anyone have code and/or advice for how to get get the current > week (with a passed current day, say) and what then end date is at > Saturday. > > So take today: Tuesday March 17, 2009 > > I want to get: > Sunday March 15, 2009 > Monday March 16, 2009 > Tuesday March 17, 2009 > Wednesday March 18, 2009 > Thursday March 19, 2009 > Friday March 20, 2009 > Saturday March 21, 2009 I just answered a question similar to this. You might check the archives. In this case, you'll need to use the getdate() function (see php.net/manual/en/ for details) to get the array of values for today (like the day of the month, month number, year, etc.). The getdate() function returns an array, one of whose members is 'wday', which is the day of the week, starting with 0 for Sunday. Use that number to determine how many days to go back from today. Then use mktime() to get the timestamps for each day in turn. You feed mktime() values from the getdate() call. Then you can use strftime() or something else to print out the dates in whatever format, given the timestamps you got. Be careful in feeding values to mktime(). If your week spans a month or year boundary, you'll need to compensate for it when giving mktime() month numbers, day numbers and year numbers. Paul -- Paul M. Foster -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP] Calendar/Date
Hi All, Does anyone have code and/or advice for how to get get the current week (with a passed current day, say) and what then end date is at Saturday. So take today: Tuesday March 17, 2009 I want to get: Sunday March 15, 2009 Monday March 16, 2009 Tuesday March 17, 2009 Wednesday March 18, 2009 Thursday March 19, 2009 Friday March 20, 2009 Saturday March 21, 2009 Thanks! -Jason -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Calendar Date Help
Robert Cummings wrote: function getStamp($dateStr,$dayVal=1){ return date('U',mktime(0,0,0, $dateStr,$dayVal,date('Y'))); } ^ ^ ^ Similarly. Cheers, Rob. Hi Rob, Changing: function setCal($h=0,$m=0,$s=0,$offset,$dayVal=1){ $stamp = date('U',mktime($h,$m,$s, $offset,$dayVal,date('Y'))); To: function setCal($h=0,$m=0,$s=0,$offset,$dayVal=1){ if (date('Y') > date('Y',date('U',mktime($h,$m,$s, $offset,$dayVal,date('Y') { $stamp = date('U',mktime($h,$m,$s, $offset,$dayVal,date('Y')+1)); } else { $stamp = date('U',mktime($h,$m,$s, $offset,$dayVal,date('Y'))); } Makes no change. Strange condition still exists. I was rather hoping that if "date('U',mktime($h,$m,$s, $offset,$dayVal,date('Y')))" is smart enough to know to increase or decrease the month value that it would do the same to the year value accordingly. $offset contain either date('n',$timestamp)-1 or date('n',$timestamp)+1 The $timestamp value comes from the array being stored in the $_SESSION['calendar'] as either 'current', 'prev', or 'next'. -- Mark - the rule of law is good, however the rule of tyrants just plain sucks! Real Tax Reform begins with getting rid of the IRS. == Powered by CentOS5 (RHEL5) -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] Calendar Date Help
On Wed, 2008-05-28 at 14:27 -0400, Mark Weaver wrote: > Hi all, > > I've put this off as long as possible, however I think I've reached an > impasse. > > I've got an application that I've been writing. One of the modules for > this app is an event calendar. I've got the calendar to the place where > it displays the current month as well as previous and future months. The > place I'm stuck is it will only show months in the past or the future > that are months in the current year. > > Basically the method I'm using to move backward and forward is with Unix > timestamps. > > 1. When the calendar first loads the "what" is checked for; > // passed in via $_GET > $what == current, prev, or next >a. "current" is the default > $now = time() > $prev = date('n',$now)-1 > $next = date('n',$now)+1 >b. Timestamp values are then stored in an array and then > sent to client in session cookie which is then accessed > upon each subsequent request to display the event calendar. > > My question/boggle is why, when the calendar advances to > December(current year) it will display January, but of the current year. > The same happens in reverse. > > Once I reach the end of the year either in the past or future the month > increases or decreases accordingly, but the year doesn't change. Since > the year value isn't changing the month calendar days that are displayed > simply repeat themselves. > > I know there's something I'm missing, but I am definitely not seeing > what it is... > > /** code below / > > $cal = new Calendar; > $calpos = array(); > > // check incoming values > if ($what === "current"){ > $cal->setCal(0,0,0,date('n'),1); > $now = time(); > $prev = $cal->getStamp(date('n',$now)-1,1); > $next = $cal->getStamp(date('n',$now)+1,1); > $calpos['curr'] = $now; > $calpos['prev'] = $prev; > $calpos['next'] = $next; > $_SESSION['calendar'] = $calpos; > } > elseif($what === "prev"){ > $peek = $_SESSION['calendar']; > $now = $peek['prev']; > $cal->setCal(0,0,0,date('n',$now),1); > $prev = $cal->getStamp(date('n',$now)-1,1); > $next = $cal->getStamp(date('n',$now)+1,1); > $calpos['curr'] = $now; > $calpos['prev'] = $prev; > $calpos['next'] = $next; > $_SESSION['calendar'] = $calpos; > } > elseif($what === "next"){ > $peek = $_SESSION['calendar']; > $now = $peek['next']; > $cal->setCal(0,0,0,date('n',$now),1); > $prev = $cal->getStamp(date('n',$now)-1,1); > $next = $cal->getStamp(date('n',$now)+1,1); > $calpos['curr'] = $now; > $calpos['prev'] = $prev; > $calpos['next'] = $next; > $_SESSION['calendar'] = $calpos; > } > > <> > function setCal($h=0,$m=0,$s=0,$offset,$dayVal=1){ >$stamp = date('U',mktime($h,$m,$s, $offset,$dayVal,date('Y'))); ^ ^ ^ You don't want the current year. Fix this to a request year. >// Using the stamp the various necessary properties are set for the >// object > > function getStamp($dateStr,$dayVal=1){ >return date('U',mktime(0,0,0, $dateStr,$dayVal,date('Y'))); > } ^ ^ ^ Similarly. Cheers, Rob. -- http://www.interjinn.com Application and Templating Framework for PHP -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP] Calendar Date Help
Hi all, I've put this off as long as possible, however I think I've reached an impasse. I've got an application that I've been writing. One of the modules for this app is an event calendar. I've got the calendar to the place where it displays the current month as well as previous and future months. The place I'm stuck is it will only show months in the past or the future that are months in the current year. Basically the method I'm using to move backward and forward is with Unix timestamps. 1. When the calendar first loads the "what" is checked for; // passed in via $_GET $what == current, prev, or next a. "current" is the default $now = time() $prev = date('n',$now)-1 $next = date('n',$now)+1 b. Timestamp values are then stored in an array and then sent to client in session cookie which is then accessed upon each subsequent request to display the event calendar. My question/boggle is why, when the calendar advances to December(current year) it will display January, but of the current year. The same happens in reverse. Once I reach the end of the year either in the past or future the month increases or decreases accordingly, but the year doesn't change. Since the year value isn't changing the month calendar days that are displayed simply repeat themselves. I know there's something I'm missing, but I am definitely not seeing what it is... /** code below / $cal = new Calendar; $calpos = array(); // check incoming values if ($what === "current"){ $cal->setCal(0,0,0,date('n'),1); $now = time(); $prev = $cal->getStamp(date('n',$now)-1,1); $next = $cal->getStamp(date('n',$now)+1,1); $calpos['curr'] = $now; $calpos['prev'] = $prev; $calpos['next'] = $next; $_SESSION['calendar'] = $calpos; } elseif($what === "prev"){ $peek = $_SESSION['calendar']; $now = $peek['prev']; $cal->setCal(0,0,0,date('n',$now),1); $prev = $cal->getStamp(date('n',$now)-1,1); $next = $cal->getStamp(date('n',$now)+1,1); $calpos['curr'] = $now; $calpos['prev'] = $prev; $calpos['next'] = $next; $_SESSION['calendar'] = $calpos; } elseif($what === "next"){ $peek = $_SESSION['calendar']; $now = $peek['next']; $cal->setCal(0,0,0,date('n',$now),1); $prev = $cal->getStamp(date('n',$now)-1,1); $next = $cal->getStamp(date('n',$now)+1,1); $calpos['curr'] = $now; $calpos['prev'] = $prev; $calpos['next'] = $next; $_SESSION['calendar'] = $calpos; } <> function setCal($h=0,$m=0,$s=0,$offset,$dayVal=1){ $stamp = date('U',mktime($h,$m,$s, $offset,$dayVal,date('Y'))); // Using the stamp the various necessary properties are set for the // object function getStamp($dateStr,$dayVal=1){ return date('U',mktime(0,0,0, $dateStr,$dayVal,date('Y'))); } -- Mark - the rule of law is good, however the rule of tyrants just plain sucks! Real Tax Reform begins with getting rid of the IRS. == Powered by CentOS5 (RHEL5) -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php