I have a PHP 7.3.17 development system with the following line of code:
$x = date('Y-m', 1646114400);
Actually this is a simplified version of the code, where the unixtime is actually in a variable. I am showing it this way for simplicity. The source of the value is from a SQL SELECT in which the column is the following expression: UNIX_TIMESTAMP(ts), where ts is a date column.
After the above line executes, the value of $x equals "2022-03".
I have two other development environments, one with PHP 7.3.11 and the other with PHP 8.1. After that same line of code executes in these environments, the value of $x is "2022-02". This has led to a hard to find bug. But the root cause is this difference in date formatting.
These two machines are in a time zone that is one hour different from the first machine, in case that is related.
Why would the date() function be acting this way, and what is the solution?
CodePudding user response:
A Unix timestamp represents a moment in the history of the world - the moment you drew your first breath has a particular Unix timestamp, completely independent of where you were born and what the local clocks said.
When you convert that timestamp into a date and time, you therefore have to decide what timezone you want to display it in - the same timestamp will be 12:00 in one timezone, 11:00 in another, and 13:00 in yet another.
Crucially in this case, a timestamp that is 00:00 on Monday in one timezone will be 23:00 on the previous Sunday in another timezone. That Sunday might be the last day of the previous month, or even the last day of the previous year.
Coming back to PHP, the date
function takes a Unix timestamp and formats it according to the default timezone you've configured on the server or script. If your different servers have different default timezones, they will sometimes show different days, months, and even years for the same timestamp.
To have more control of this, I recommend you look at the DateTimeImmutable class.
CodePudding user response:
You answered your question yourself, because each of your development environments is in a different time zone you will first need to set the default time zone for your script.
So I think u need somthing like this:
date_default_timezone_set('UTC');
$x = date('Y-m', 1646114400);