ActionOwl
ActionOwl

Reputation: 1473

Php strtotime "rounding" end of month

Any idea why strtotime sometimes round the end of the month to the next month?

for($i=1;$i<12;$i++)
{
    $d = "Y-$i-t 00:00:00";
    echo "Date as String: " . $d = date($d) . "\n";
    echo "Date as UnixTime: " . strtotime($d) . "\n";
    echo "UnixTime back to String: " . $d = date('Y-m-d 00:00:00', strtotime($d)) . "\n";
    echo "String back to UnixTime: " . strtotime($d) . "\n\n";
}

Results:
Date as String: 2011-1-31 00:00:00
Date as UnixTime: 1296450000
UnixTime back to String: 2011-01-31 00:00:00
String back to UnixTime: 1296450000

Date as String: 2011-2-31 00:00:00
Date as UnixTime: 1299128400
UnixTime back to String: 2011-03-03 00:00:00
String back to UnixTime: 1299128400

Date as String: 2011-3-31 00:00:00
Date as UnixTime: 1301544000
UnixTime back to String: 2011-03-31 00:00:00
String back to UnixTime: 1301544000

Date as String: 2011-4-31 00:00:00
Date as UnixTime: 1304222400
UnixTime back to String: 2011-05-01 00:00:00
String back to UnixTime: 1304222400

Date as String: 2011-5-31 00:00:00
Date as UnixTime: 1306814400
UnixTime back to String: 2011-05-31 00:00:00
String back to UnixTime: 1306814400

Date as String: 2011-6-31 00:00:00
Date as UnixTime: 1309492800
UnixTime back to String: 2011-07-01 00:00:00
String back to UnixTime: 1309492800

Date as String: 2011-7-31 00:00:00
Date as UnixTime: 1312084800
UnixTime back to String: 2011-07-31 00:00:00
String back to UnixTime: 1312084800

Date as String: 2011-8-31 00:00:00
Date as UnixTime: 1314763200
UnixTime back to String: 2011-08-31 00:00:00
String back to UnixTime: 1314763200

Date as String: 2011-9-31 00:00:00
Date as UnixTime: 1317441600
UnixTime back to String: 2011-10-01 00:00:00
String back to UnixTime: 1317441600

Date as String: 2011-10-31 00:00:00
Date as UnixTime: 1320033600
UnixTime back to String: 2011-10-31 00:00:00
String back to UnixTime: 1320033600

Date as String: 2011-11-31 00:00:00
Date as UnixTime: 1322715600
UnixTime back to String: 2011-12-01 00:00:00
String back to UnixTime: 1322715600

Upvotes: 0

Views: 670

Answers (3)

Roger Halliburton
Roger Halliburton

Reputation: 2021

30 days has September, April, June, and November. All the rest have 31, except February which has 28 and sometimes 29.

Upvotes: -1

webbiedave
webbiedave

Reputation: 48897

t returns the number of days in the month of the date that was passed (or, in your case, since you're not passing a date, the current month). Because you are running this code in January, the result will be 31.

February doesn't have 31 days so PHP will add the extra 3 days moving you to March 3rd.

Upvotes: 3

labue
labue

Reputation: 2623

Because not all months have 31 days.

Upvotes: 0

Related Questions