Tải bản đầy đủ (.pdf) (9 trang)

Professional Information Technology-Programming Book part 72 pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (27.27 KB, 9 trang )




Summary
In this lesson you have learned the basics of regular expressions. If you want to
find out more, you can refer to Sams Teach Yourself Regular Expressions in 10
Minutes by Ben Forta.
In the next lesson you will learn how to handle date and time values in PHP.




Lesson 9. Working with Dates and Times
In this lesson you will learn how to store, display, and manipulate date and time
values in PHP.



Date Formats
PHP does not have a native date data type, so in order to store date values in a
script, you must first decide on the best way to store these values.
Do
-It-Yourself Date Formats
Although you often see dates written in a structured format, such as 05/03/1974 or
2001-12-
31, these are not ideal formats for working with date values. However, the
latter of these two is more suitable than the first because the order of its
components is from most significant (the year) to the least significant (the day), so
values can be compared using the usual PHP operators.
As a string, 2002-01-01 is greater than 2001-12-31, but because
comparisons are performed more efficiently on numbers than on strings, this could


be written better as just 20020201, where the format is YYYYMMDD. This format
can be extended to include a time portionagain, with the most significant elements
firstas YYYYMMDDHHMMSS, for example.
However, date arithmetic with this format is nearly impossible. While you can add
one to 20040501, for instance, and find the next day in that month, simply
adding one to 20030531 would result in a nonsense date of May 32.
Unix Timestamp Format
The Unix timestamp format is an integer representation of a date and time. It is a
value that counts the number of seconds since midnight on January 1, 1970.
The Unix Epoch A timestamp with integer value zero represents
precisely midnight, Greenwich Mean Time (GMT), on January 1,
1970. This date is known as the Unix Epoch.

Right now, we have a 10-digit date and time timestamp. To find the current
timestamp, you use the time function:
echo time();

The Unix timestamp format is useful because it is very easy to perform
calculations on because you know that the value always represents a number of
seconds. For example, you can just add 3,600 to a timestamp value to increase the
time by one hour or add 86,400 to add one daybecause there are 3,600 seconds in
an hour and 86,400 seconds in a day.
One drawback, however, is that the Unix timestamp format cannot handle dates
prior to 1970. Although some systems may be able to use a negative timestamp
value to count backward from the Epoch, this behavior cannot be relied on.
Timestamps are good for representing contemporary date values, but they may not
always be suitable for handling dates of birth or dates of historical significance.
You should consider what va
lues you will be working with when deciding whether
a timestamp is the correct format to use.

Timestamp Limitations The maximum value of a Unix timestamp
depends on the system's architecture. Most systems use a 32-bit
integer to store a timestamp, making the latest time it can
represent 3:14am on January 19, 2038.





Working with Timestamps
There are times when using your own date format is beneficial, but in most cases a
timestamp is the best choice. Let's look at how PHP interacts with the timestamp
date format.
Formatting Dates
In Lesson 1, "Getting to Know PHP," you used the date function to display the
current date by passing a format string as the argument, such as in the following
example:
echo date("j F Y H:i:s");

The date displayed looks something like this:
12 November 2004 10:23:55

The optional second argument to date is a timestamp value of the date that you
want to display. For example, to display the date when a timestamp first requires a
10-digit number, you could use the following:
echo date("j F Y H:I:s", 1000000000);

The list of format codes for the date function is shown in Table 9.1.
Table 9.1. Format Codes for date
Code


Description
a

Lowercase am or pm
A

Uppercase AM or PM
d

Two-digit day of month, 0131
D

Three-letter day name, MonSun
F

Full month name, JanuaryDecember
g

12-hour hour with no leading zero, 112
G

24-hour hour with no leading zero, 023
h

12-hour hour with leading zero, 0112
H

24-hour hour with leading zero, 0023
I


Minutes with leading zero, 0059
j

Day of month with no leading zero, 131
l

Full day name, MondaySunday
m

Month number with leading zeros, 0112
M

Three letter month name, JanDec
n

Month number with no leading zeros, 112
s

Seconds with leading zero, 0059
S

Ordinal suffix for day of month, st, nd, rd, or th

w

Number of day of week, 06, where 0 is Sunday

W


Week number, 053
y

Two-digit year number
Y

Four-digit year number
z

Day of year, 0365

Creating Timestamps
Don't worry; you don't have to count from January 1, 1970, each time you want to
calculate a timestamp. The PHP function mktime returns a timestamp based on
given date and time values.
The arguments, in order, are the hour, minute, second, month, day, and year. The
following example would assign $timestamp the timestamp value for 8 a.m. on
December 25, 2001:
$timestamp = mktime(8, 0, 0, 12, 25, 2001);

The Unix timestamp format counts from January 1, 1970, at midnight GMT. The
mktime function returns a timestamp relative to the time zone in which your
system operates. For instance, mktime would return a timestamp value 3,600
higher when running on a web server in Texas than on a machine in New York
with the same arguments.
Daylight Saving Time
If you are only concerned with the date part
of a timestamp, the first three arguments to mktime
only matter if
they are close to midnight at a time of the year when daylight

saving time is a factor.
For instance, when the clocks are moved back one hour, that day
is only 23 hours long. Adding 86,400 seconds to a timestamp that
represents midnight on that day will actually move the day part of
the timestamp forward two days. You can use midday instead of
midnight as the time element to avoid these issues.

Greenwich Mean Time To obtain timestamp values that are
always relative to GMTthe time in London when there is no
daylight saving time adjustmentyou use gmmktime instead of
mktime.

The mktime function is forgiving if you supply it with nonsense arguments, such
as a day of the month that doesn't exist. For instance, if you try to calculate a
timestamp for February 29 in a non-leap year, the value returned will actually
represent March 1, as the following statement confirms:
echo date("d/m/Y", mktime(12, 0, 0, 2, 29, 2003));

You can exploit this behavior as a way of performing date and time arithmetic.
Consider the following example, which calculates and displays the date and time
37 hours after midday on December 30, 2001:
$time = mktime(12 + 37, 0, 0, 12, 30, 2001);
echo date("d/m/Y H:i:s", $time);

By simply adding a constant to one of the arguments in mktime, you can shift the
timestamp value returned by that amount. The date and time display as follows:
01/01/2002 01:00:00

The value returned in this example has correctly shifted the day, month, year, and
hour values, taking into account the number of days in December and that

December is the last month of the year.
Converting Other Date Formats to Timestamps
If you have a date stored in a format like DD-MM-YYYY
, it's a fairly simple process
to convert this to a timestamp by breaking up the string around the hyphen
character. The explode function takes a delimiter argument and a string and
ret
urns an array that contains each part of the string that was separated by the given
delimiter.
The following example breaks a date in this format into its components and builds
a timestamp from those values:
$date = "03-05-1974";
$parts = explode("/", $date);
$timestamp = mktime(12, 0, 0,
$parts[1], $parts[0], $parts[2]);

For many date formats, there is an even easier way to create a timestampusing the
function strtotime. The following examples all display the same valid
timestamp from a string date value:
$timestamp = strtotime("3 May 04");
$timestamp = strtotime("3rd May 2004");
$timestamp = strtotime("May 3, 2004");
$timestamp = strtotime("3-may-04");
$timestamp = strtotime("2004-05-03");
$timestamp = strtotime("05/03/2004");

Note that in the last examples, the date format given is
MM/DD/YYYY, not
DD/MM/YYYY. You can find the complete list of formats that are acceptable to
strtotime at www.gnu.org/software/tar/manual/html_chapter/tar_7.html.

Getting Information About a Timestamp
You can use the date function to return part or all of the date that a timestamp
represents as a formatted string, but PHP also provides the geTDate function,
which returns useful values from a timestamp.
Taking a single timestamp argument, geTDate returns an associative array that
contains the indexes shown in Table 9.2.
Table 9.2. Key Elements Returned by geTDate
Key Description
seconds

Seconds, 059
minutes

Minutes, 059
hours

Hours, 023
mday

Day of the month, 031
wday

Day of the week, 06, where 0 is Sunday

yday

Day of the year, 0365
mon

Month number, 012

year

Four-digit year number
weekday

Full day name, SundaySaturday
month

Full month name, JanuaryDecember

The following example uses getdate to determine whether the current date falls
on a weekday or weekend:
$now = getdate();
switch ($now[wday]) {
case 0: // Sunday
case 6: // Saturday
echo "It's the weekend";
break;
default: echo "It's a weekday";
}

Note that w
hen getdate is called without a timestamp argument, it returns an
array that contains the elements in Table 9.2 for the current time.


×