Gidday Justin,

For us guys that don't get dates very often, the subject is one of intense 
fascination! I answered a bunch of
these questions a couple of weeks back, and reproduce that discussion below. Also some 
comments/responses to you
interspersed:-

> I'm looking to normalise the way in which I work with dates and times,
> hopefully saving myself some time and effort along the way.
>
> Currently, for, say, a news post, i'm using a MySQL DATE column
> (YYYY-MM-DD), but since this isn't all that good (visually) for use on a
> site, I find myself converting it back out to something like DD-MM-YY or
> DD-MM for use on the site.  Not exactly hard, but it's gotta be done
> every time.

=to ease the effort of repeated activities employ/implement a function (as you say, 
saves time). Fortunately PHP
and SQL/MySQL provide us with plenty, out of the box.

> Now I find myself wanting to sort things by date (where the ID might be
> in the wrong order... so 2001-12-25 is listed before 2001-12-26, etc),
> and more importantly, comparing two dates (3 days away, 3 days ago, 3
> hours ago, etc etc).

=the reason many people find ISO-format dates confusing is simply that they've grown 
up with something else
(presumably in your case dd/mm/yy). If you sit down and think about the sequence of 
data, running from the
largest unit to the smallest, consistently, you will see that it makes good sense. 
These have been adopted as
local/national standards in various places, eg the EU, but we still don't see them too 
much - guess we're still
smarting from KM vs miles and KG vs pounds-weight (I'm still paying off the bill for 
that 1KM of sausages I
ordered...)

=the reason it makes good sense in a computer is because it will fulfil basic 
functions in both use of a date:
(1) to document some date/time, and (2) to be used in basic computations. The best 
example I can think of is a
logging function, eg OpSys tools and Apache. Take a look at the native output any of 
these and you'll see ISO
dates left, right, and center. Other date formats will fulfill one or other of these 
functions, but will not
compromise between both so well.

=if you want to sort an ISO date column, go ahead and do it. ISO dates can be 
compared, just as they are:

2001-12-25 < 2001-12-26 = true
thus Christmas Day came before Boxing Day, last year (and most other years...)

=This also applies to ISO dates expressed as an integer

20011225 < 20011226 = true

=If you want to perform calculations on ISO-dates then check out the date functions 
section in the MySQL manual
for DATE_ADD, DATE_DIFF, etc. They will achieve your comparisons, adjustments by 
period of time (days), etc.

=In the same way, PHP has a rich set of date calculation functions, also well covered 
in their manual. However
these are complementary and deal in the PHP prefered date formats.

=Sadly, there is no substitute for hitting the books (see advice on this below).

> Would I be better off using a unix timestamp for everything, then using
> it to:
>
> - convert to different formats
> - compare
> - sort in date order
> - etc etc
>
> Also, I've noticed there is a timestamp column type in MySQL... is there
> a way to cut down on PHP code by using MySQl alone to enter the
> timestamp (or date) for me?

=see comments below about selecting the date format to suit the usage/purpose intended 
(if you don't want to
spend all day converting back and forth - spending time, re-making time?).

=There is no ONE right answer - that's why we've been given choices. BEWARE of the 
word "timestamp" in that a
UNIX timestamp is not the same thing as a MySQL timestamp!

> Any other suggestions on a sensible method of implementing dates & times
> accross many sites and many bits of code?

=here they come... one of your respondents talked about doing subtraction on ISO 
dates. This will not work - the
discussion (below) started off with this question "why doesn't it work?":-


RE: [PHP] counting with dates (help!)

> $today = date("Ymd", mktime(0,0,0, date(m),date(d),date(Y)));
> $last_week = date("Ymd", mktime(0,0,0, date(m),date(d)-7,date(Y)));
> echo ($today - $last_week);
> The result is a number like 8876 (20020107-20011231 = 8876)
> But in date thinking it should be 7!
No, that's the difference in time represented by the number of seconds.
You still need to work with it a little more.
8876 / 60 = number of hours  /* 60 = number of seconds in an hour */
8876 / 60 / 24 = number of days.  /* 24 = number of hours in a day */

=I'm sorry but neither the above, nor the suggestion of Julian dates was correct (in 
all cases). The two numbers
($today and $last_week) generated in the PHP code above are in CCYYMMDD format (as 
used by MySQL to store dates,
BTW).

=So you are correct (Sander):
20020107 less
20011231 equals
00008876

=but this number is meaningless. If the formulae proposed above are applied, the 
answer is not 7 days.

=Similarly (Julian dates = CCYYDDD format)
2002007 less
2001365 equals
0000642

=However let's jump forward in time, to tomorrow (hey what's 45 minutes between 
friends?):
20020108 less
20020101 equals
00000007

=and:
2002008 less
2002001 equals
0000007

=woohoo! How come they 'work' tomorrow but not today? Because (using the first format) 
whilst the last and
second to last digits represent days (hence it 'works' tomorrow), the preceding pair 
of digits represent months,
and the procession of days into months is not a decimal progression. (smack your 
forehead into the wall
now...but don't do it too often, because no matter how good it feels, it'll feel a 
whole lot better when you
stop!)

=this is also the reason that using a Julian date format won't work - they look like 
decimal numbers (look like
a duck), you can perform arithmetic on them (walk like a duck), but if your 
calculation spans a year-break you
will discover that they are not really decimal numbers (and they bark like a dog).

=The three main date formats are:

1 CCYYMMDD (as mentioned above) because it is the way MySQL does things. You can't use 
this for 'real
arithmetic' as we've just discussed, but you can do comparisons,
eg is 'today' > 'yesterday' (when I was young...)

2 dd-mmmmmm-ccyy (or variant) which is the way humans like to read their dates. This 
is for appearances, and
once again not for arithmetic/logic.
PS never, never, never (did I say "never") use dd/mm/yy or mm/dd/yy because of the 
ambiguities it causes -
particularly between Americans and the rest of the world (and date-guessing functions 
- see your manual)

3 UNIX Epoch timestamp which is a count of the number of seconds since midnight 1 Jan 
1970 (GMT). This is an
absolutely ugly way to look at dates (and times), but it is really easy to use for 
arithmetic and after a while
you don't think it at all odd that without any effort you can recall that there are 
86,400 seconds in one day.

=Now that piece of trivia, a pocket protector, and band-aid keeping your spectacle 
frames together will make you
a babe-magnet in every bar (well those that serve Heineken anyway).

=Putting aside several HOURS to study the two manuals to get your head around date 
functions is time well spent
(yes I know, it takes me a little longer...) - particularly the sheer number of SQL 
date functions (the power of
which is all too frequently overlooked). Regarding the PHP functions, I made a page 
list, and as I made notes
about each one, I annotated it with a 'purpose' so that I could keep them straight in 
my mind. Well, enough of
me and the reasons why girls in bars don't talk to me...

=Regards,
=dn




-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to