Lawrence
Lawrence

Reputation: 727

Converting date to user timezone in Joomla

thanks for reading.

Just need to know how i convert datetime gotten from my sql tables in gmtime to datetime in user timezone.

the following is my code but doesn't seem to work..

//WHERE $post_arr[5] is date from sql

$user_date=convert_date_for_user($post_arr[5]);

function convert_date_for_user($date_time){
    $user = JFactory::getUser();
    $db = JFactory::getDBO();

    $timezone=$user->getParam('timezone');

    echo $tz_offset;
    $user_date = JFactory::getDate($date_time,$timezone);
    $user_date_str = $user_date->toUnix(true);

    return $user_date_str;
}

It converts but I'm getting all the wrong time from the above code.

Upvotes: 3

Views: 9605

Answers (7)

ecedenyo
ecedenyo

Reputation: 193

Having tried all the given possible solutions here and not getting the date in the user's timezone (Joomla! v.3.9.14), here's my (proven) solution:

$oUser_TZ  = JFactory::getUser()->getTimezone();
$aUser_tz  = (array)$oUser_TZ; // almost sure this step is not that necessary
$full_date = JFactory::getDate('now', $aUser_tz['timezone']); // pretty sure $oUser_tz->timezone will work

// I had try to use $full_date->Format('Y-m-d H:i:s') but it was giving me the non-converted-to-wanted-timezone date, so
$date_converted = substr($full_date, 0, 19);

date_converted gives me the date in format Y-m-d H:i:s and in the wanted timezone.

Upvotes: 1

dave37
dave37

Reputation: 119

With Joomla 2.5+ (i think), you can use the following code

echo JHtml::_('date', $input, $format, $tz, $gregorian);

$input can be one of the following values:

  • "now" for the current time (DEFAULT)
  • A date/time string in a format accepted by date()

$format can be one of the following values:

$tz can be one of the following values:

  • TRUE to use the user's time zone (DEFAULT). Note: If the user's time zone is not set then the global config time zone is used.
  • FALSE to use global config time zone
  • NULL for no conversion
  • A timezone string (eg: "America/Los_Angeles", see http://php.net/manual/en/timezones.php)

$gregorian can be one of the following values:

  • TRUE to use Gregorian calendar
  • FALSE to NOT use Gregorian calendar (DEFAULT)

Upvotes: 1

Demis Palma ツ
Demis Palma ツ

Reputation: 8037

JHtml::date($post_arr[5]);

If you want a different format, use the second parameter: JHtml::date($post_arr[5], DateTime::RFC2822);

Which is equivalent to: 1. Create a JDate object with an UTC date read from the database 2. Get the correct Time Zone in Jomla Global Configuration and User Configuration 3. Call setTimeZone() to convert your JDate object to user local time 4. Call format() to format the JDate object as a well formatted string

Upvotes: 0

Lit
Lit

Reputation: 1129

Try This:

  $date = JFactory::getDate(); // now - 2014-03-11 08:45:22
  $date->setOffset(8); // UTC+8
  echo $date->toMySQL();  // wrong - 2014-03-11 08:45:22
  echo '<br />';
  echo $date->toFormat(); // right - 2014-03-11 16:45:22

Upvotes: 0

WooDzu
WooDzu

Reputation: 4866

The simplest way to do it:

$useUserTimeZone = true;
JHtml::date($sqlGmtTimestamp , 'D F n, Y', $useUserTimeZone);

$sqlGmtTimestamp takes GMT timestamp/datetime

$useUserTimeZone is a flag to use user's timezone, otherwise server's timezone will be used.

more details here: http://docs.joomla.org/API16:JHtml/date

Upvotes: 5

Lawrence
Lawrence

Reputation: 727

This is the function that works for me:-

//WHERE date_time is the format of the date taken directly from database(ie: 0000-00-00 00:00:00)
function convert_time_zone($date_time){
    $user =& JFactory::getUser();
    $db = JFactory::getDBO();
    $timezone=$user->getParam('timezone','UTC');

    $time_object = new DateTime($date_time, new DateTimeZone('UTC'));
    $time_object->setTimezone(new DateTimeZone($timezone));

    $user_datetime=$time_object->format('Y-m-d H:i:s');

    //SELECT ONLY 1 line below
    return $user_datetime;  //WOULD RETURN DATETIME IN 0000-00-00 00:00:00  
    //OR
    return $time_object->getTimestamp();  //WOULD RETURN DATETIME IN UNIX TIMESTAMP
}

Its a little out of the way as i was hoping to use functions included in the joomla API to do it. If anyone could provide a better solution please do. and i select it as the right answer.

Upvotes: 1

Craig
Craig

Reputation: 9330

You don't specify your Joomla version but, did you try Joomla's JDate class directly?

// Get the User and their timezone
$user = JFactory::getUser();
$timeZone = $user->getParam('timezone', 'UTC');

// Create JDate object set to now in the users timezone.
$myDate = JDate::getInstance('now', $timeZone);

// Gets the date as UNIX time stamp.
$myDate->toUnix():


// For your example using a method
function convert_date_for_user($date_time)
{
    // Get the User and their timezone
    $user = JFactory::getUser();
    $timeZone = $user->getParam('timezone', 'UTC');

    // Create JDate object set to now in the users timezone.
    $myDate = JDate::getInstance($date_time, $timeZone);

    return $myDate->toUnix();
}

Upvotes: 1

Related Questions