PHP convert UTC time to local time

62,386

Solution 1

The reason your code isn't working is most likely because your server is in UTC time. So the local time of the server is UTC.

Solution #1

One potential solution is to do the following server side and pass the epoch integer to the browser:

$utc = "2014-05-29T04:54:30.934Z";
$time = strtotime($utc); //returns an integer epoch time: 1401339270

Then use JavaScript to convert the epoch integer to the user's local time (the browser knows the user's timezone).

Solution #2

You can get the browser to send you the user's timezone. Then you can use this information to calculate the date string server side instead of browser side. See more here: https://stackoverflow.com/a/5607444/276949

This will give you the user's offset (-7 hours). You can use this information to set the timezone by looking here: Convert UTC offset to timezone or date

Solution 2

Simply use a DateTimeZone, eg

$dt = new DateTime($utc);
$tz = new DateTimeZone('Asia/Kolkata'); // or whatever zone you're after

$dt->setTimezone($tz);
echo $dt->format('Y-m-d H:i:s');

Demo ~ http://ideone.com/fkM4ct

Solution 3

If this is not done via a user profile setting, it is probably easier and simpler to use a javascript time library eg. moment.js (http://momentjs.com/) to solve this problem (send all date/times in UTC and then convert them on the client end).

Javascript eg. (I am sure this can be achieved without creating two moment objects (fix that at your leisure).

function utcToLocalTime(utcTimeString){
    var theTime  = moment.utc(utcTimeString).toDate(); // moment date object in local time
    var localTime = moment(theTime).format('YYYY-MM-DD HH:mm'); //format the moment time object to string

    return localTime;
}

php example for server side resolution (only use one of these solutions, both together will produce an incorrect time on the client end)

/**
 * @param $dateTimeUTC
 * @param string $timeZone
 * @param string $dateFormat
 * @return string
 *
 * epoch to datetime (utc/gmt)::
 * gmdate('Y-m-d H:i:s', $epoch);
 */
function dateToTimezone($timeZone = 'UTC', $dateTimeUTC = null, $dateFormat = 'Y-m-d H:i:s'){

    $dateTimeUTC = $dateTimeUTC ? $dateTimeUTC : date("Y-m-d H:i:s");

    $date = new DateTime($dateTimeUTC, new DateTimeZone('UTC'));
    $date->setTimeZone(new DateTimeZone($timeZone));

    return $date->format($dateFormat);
}

Solution 4

Just send the UTC time to the browser. Use JavaScript to parse it with a Date object, or with moment.js, then output it as text.

By doing it in client-side JavaScript, you don't need to be aware of the user's time zone. The browser will be responsible for that instead.

Solution 5

Use function date_default_timezone_set before there you want to local time after that again setup UTC Europe/Lisbon timezone List of Supported Timezones

  <?php

$utc = "2014-05-29T04:54:30.934Z";
$time = strtotime($utc);
echo "<br/>Defualt UTC/server time".$dateInLocal = date("Y-m-d H:i:s", $time);

//your local time zone put here
date_default_timezone_set('Asia/Kolkata');

echo "<br/>Local time". $dateInLocal = date("Y-m-d H:i:s", $time);
?>
Share:
62,386
Dibish
Author by

Dibish

Software Engineer, AMT

Updated on July 09, 2022

Comments

  • Dibish
    Dibish almost 2 years

    Am getting a UTC time from my server like the following format, my requirement is to convert the UTC time to local time. So users can see a user friendly time on their browser based on their timezone. Please help me to solve this issue. Thank you

    $utc = "2014-05-29T04:54:30.934Z"
    

    I have tried some methods but not working in my case

    First

    $time = strtotime($utc);
    $dateInLocal = date("Y-m-d H:i:s", $time);
    echo $dateInLocal;
    

    Second

    $time = strtotime($utc .' UTC');
    $dateInLocal = date("Y-m-d H:i:s", $time);
    echo $dateInLocal;
    
  • Dibish
    Dibish about 10 years
    Thanks for the quick reply. How do i know the 'Asia/Kolkata' timezone for the user. The user may be any where for the world. Is it a static value?
  • Phil
    Phil about 10 years
    @Dibish I assumed you knew the required timezone. See Martin's answer regarding getting information from the client
  • Dibish
    Dibish about 10 years
    Thank you so much for your help
  • Matt Johnson-Pint
    Matt Johnson-Pint almost 10 years
    Solution #2 is ill-advised, as you can only get the current time zone offset directly from JavaScript. You can guess at the time zone with jsTimeZoneDetect, but that will only get you so far. Solution #1 is better, but has it's own set of problems.
  • Martin Konecny
    Martin Konecny over 7 years
    @MattJohnson I guess you could extract the timezone from new Date() which returns Tue Oct 25 2016 12:43:28 GMT-0400 (EDT), but EDT/EST isn't very unique if I recall (there are various timezones in the world which might overlap with the 3 character timezone representation). Perhaps a mix of the offset and the 3 character representation might work.
  • Matt Johnson-Pint
    Matt Johnson-Pint over 7 years
    Unfortunately, the value in parenthesis is implementation specific, and varies considerably across platforms. It's not always an abbreviation, and yes - abbreviations are often ambiguous (there are 5 different CST's, for example).
  • thedanotto
    thedanotto over 7 years
    YOU NEED TO USE ;
  • Robert Mauro
    Robert Mauro over 5 years
    One other deficiency (for certain process or server related needs) is that this drops the milliseconds. For those who need such accuracy, that can be resolved by tailing the milliseconds (of the source) onto the result and creating a numeric instead of an int.
  • Sven Eberth
    Sven Eberth about 3 years
    Welcome to Stack Overflow! Code-only answers are not particularly helpful. Please add some descriptions of how this code solves the problem.