2013-06-18 3 views
2

merci pour la lecture.Date de conversion au fuseau horaire de l'utilisateur dans Joomla

Juste besoin de savoir comment je convertis datetime obtenu à partir de mes tables sql dans gmtime à datetime dans le fuseau horaire de l'utilisateur.

ce qui suit est mon code, mais ne semble pas fonctionner ..

//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; 
} 

Il convertit, mais je deviens tout le temps mal du code ci-dessus.

+0

Êtes-vous absolument sûr que les heures stockées dans la base de données sont gmtime? Avez-vous vérifié quelques valeurs? Les fuseaux horaires sont très délicats. Joomla pourrait utiliser l'heure de votre serveur, qui n'est probablement pas GMT. –

+0

Oui. J'ai vérifié. Les timings affichés sont -6 GMT au lieu de mes paramètres de fuseau horaire de l'utilisateur qui devrait être de +8 pour singapour. Dans ma base de données, j'ai entré le format de synchronisation en tant que gmtime ("Y-m-d H: i: s") – Lawrence

Répondre

1

C'est la fonction qui fonctionne pour moi: -

//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 
} 

Son un peu de la façon que j'espérais utiliser les fonctions incluses dans l'API joomla pour le faire. Si quelqu'un pouvait fournir une meilleure solution, veuillez le faire. et je le choisis comme la bonne réponse.

1

Vous ne spécifiez pas votre version de Joomla mais, avez-vous essayé la classe JDate de Joomla directement?

// 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(); 
} 
2

La façon la plus simple de le faire:

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

$ sqlGmtTimestamp prend horodatage GMT/datetime

$ useUserTimeZone est un indicateur pour utiliser le fuseau horaire de l'utilisateur, sinon le fuseau horaire du serveur être utilisé.

plus de détails ici: http://docs.joomla.org/API16:JHtml/date

+0

C'est la bonne façon. – atpatil11

0

Essayez ceci:

$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 
0
JHtml::date($post_arr[5]); 

Si vous souhaitez un format différent, utilisez le second paramètre: JHTML :: Date (post_arr $ [5], DateTime :: RFC2822);

Ce qui équivaut à: 1. Créez un objet JDate avec une date UTC lue dans la base de données 2. Obtenez le bon fuseau horaire dans Jomla Configuration globale et Configuration utilisateur 3. Appel settimezone() pour convertir votre JDate object to user local time 4. Appelez format() pour formater l'objet JDate en tant que chaîne correctement formatée.

0

Avec Joomla 2.5+ (je pense), vous pouvez utiliser le code suivant

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

entrée $ peut être l'une des valeurs suivantes:

  • "maintenant" pour l'heure actuelle (DEFAULT)
  • une date/chaîne de temps dans un format accepté par date()

le format $ peut être l'une des valeurs suivantes:

$ tz peut être l'une des valeurs suivantes:

TRUE pour utiliser le fuseau horaire de l'utilisateur (DEFAULT).
  • TRUE. Remarque: Si le fuseau horaire de l'utilisateur n'est pas défini, le fuseau horaire de configuration globale est utilisé.
  • FAUX utiliser le fuseau horaire de configuration globale
  • NULL sans conversion
  • Une chaîne de fuseau horaire (par exemple: "Amérique/Los_Angeles", voir http://php.net/manual/en/timezones.php)

$ grégorienne peut être l'un des valeurs suivantes:

  • TRUE pour utiliser le calendrier grégorien
  • FAUX de ne pas utiliser Gregori un calendrier (DEFAUT)
Questions connexes