J'ai besoin d'un moyen simple de convertir un horodatage en UTC (quel que soit le fuseau horaire dans lequel se trouve le serveur) HOPEFULLY sans utiliser aucune bibliothèque.
Essayez le getTimezone et setTimezone , voir l'exemple
(Mais cela utilise une classe)
METTRE À JOUR:
Sans cours, vous pouvez essayer quelque chose comme ceci:
$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");
REMARQUE: vous devrez peut-être également redéfinir le fuseau horaire sur l'original.
Utilisation de DateTime:
$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok
$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC
Faire de cette façon:
gmdate('Y-m-d H:i:s', $timestamp)
ou simplement
gmdate('Y-m-d H:i:s')
pour obtenir "MAINTENANT" en UTC.
Vérifiez la référence:
Si vous avez une date dans ce format AAAA-MM-HH jj: mm: ss, .__, vous pouvez tromper php en ajoutant un UTC à la fin de votre "chaîne datetime" et utiliser strtotime pour le convertir.
date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";
Cela imprimera ceci:
2009-01-01 13:00:00
2009-06-01 14:00:00
Et comme vous pouvez le constater, il règle également le problème de l'heure d'été.
Un peu étrange moyen de le résoudre .... :)
Comme strtotime requiert un format d'entrée spécifique, DateTime :: createFromFormat pourrait être utilisé (php 5.3+ est requis)
// set timezone to user timezone
date_default_timezone_set($str_user_timezone);
// create date object using any given format
$date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime);
// convert given datetime to safe format for strtotime
$str_user_datetime = $date->format('Y-m-d H:i:s');
// convert to UTC
$str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime));
// return timezone to server default
date_default_timezone_set($str_server_timezone);
J'utilise parfois cette méthode:
// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");
// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));
Travaux tout LA PLUPART du temps.
Convertit la chaîne de fuseau horaire local en chaîne UTC.
par exemple. Fuseau horaire de la Nouvelle-Zélande
$datetime = "2016-02-01 00:00:01";
$given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland"));
$given->setTimezone(new DateTimeZone("UTC"));
$output = $given->format("Y-m-d H:i:s");
echo ($output);
Avec PHP 5 ou supérieur, vous pouvez utiliser la fonction datetime :: format (voir documentation http://us.php.net/manual/fr/datetime.format.php )
echo strftime( '%e %B %Y' ,
date_create_from_format('Y-d-m G:i:s', '2012-04-05 11:55:21')->format('U')
); // 4 May 2012
http://php.net/manual/en/function.strtotime.php ou si vous n'avez pas besoin d'utiliser une chaîne mais des composants de temps, alors http://us.php.net/manual/ en/function.mktime.php
Si vous ne craignez pas d'utiliser la classe DateTime de PHP, disponible depuis PHP 5.2.0, plusieurs scénarios peuvent correspondre à votre situation:
Si vous avez un objet $givenDt
DateTime que vous souhaitez convertir en UTC, il sera converti en UTC:
$givenDt->setTimezone(new DateTimeZone('UTC'));
Si vous avez besoin du $givenDt
original plus tard, vous pouvez également souhaiter cloner l'objet DateTime donné avant la conversion de l'objet cloné:
$utcDt = clone $givenDt;
$utcDt->setTimezone(new DateTimeZone('UTC'));
Si vous ne disposez que d’une chaîne datetime, par exemple, $givenStr = '2018-12-17 10:47:12'
, vous créez d'abord un objet datetime, puis vous le convertissez. Notez que cela suppose que $givenStr
est dans le fuseau horaire configuré de PHP.
$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
Si la chaîne de date/heure donnée est dans un fuseau horaire différent de celui de votre configuration PHP, créez alors l'objet datetime en fournissant le fuseau horaire correct (voir la liste liste des fuseaux horaires PHP - ). Dans cet exemple, nous supposons le fuseau horaire local à Amsterdam:
$givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
$givenDt->setTimezone(new DateTimeZone('UTC'));
sinon, vous pouvez essayer ceci:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>
ceci produira:
2017-10-25 17:13:20 Asie/Singapour
vous pouvez utiliser cela dans l'attribut value d'une zone de saisie de texte si vous souhaitez uniquement afficher une date en lecture seule.
supprimez le «e» si vous ne souhaitez pas afficher votre région/pays.
Suivez ces étapes pour obtenir l'heure UTC de tout fuseau horaire défini dans le système local de l'utilisateur (cela sera nécessaire pour que les applications Web enregistrent différents fuseaux horaires au format UTC):
Javascript (côté client):
var dateVar = new Date();
var offset = dateVar.getTimezoneOffset();
//getTimezoneOffset - returns the timezone difference between UTC and Local Time
document.cookie = "offset="+offset;
Php (côté serveur):
public function convert_utc_time($date)
{
$time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:'';
if($time_difference != ''){
$time = strtotime($date);
$time = $time + ($time_difference*60); //minutes * 60 seconds
$date = date("Y-m-d H:i:s", $time);
} //on failure of js, default timezone is set as UTC below
return $date;
}
..
..
//in my function
$timezone = 'UTC';
$date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s')
echo strtotime($date. ' '. $timezone)
essayer
écho date ('F d Y', strtotime ('2010-01-19 00:00:00'));
affichera:
19 janvier 2010
vous devriez changer l'heure du format pour voir d'autres sorties
Comme une amélioration sur (réponse de Phill Pafford } _ (je ne comprenais pas son 'Y-d-mTG: i: sz' et il suggéra de rétablir le fuseau horaire). Je propose donc ceci (je me suis compliqué en modifiant le format HMTL en clair/texte ...):
<?php
header('content-type: text/plain;');
$my_timestamp = strtotime("2010-01-19 00:00:00");
// stores timezone
$my_timezone = date_default_timezone_get();
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n";
// changes timezone
date_default_timezone_set("UTC");
echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n";
echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n";
// reverts change
date_default_timezone_set($my_timezone);
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n";
?>
Fonction de normalisation à usage général pour formater un horodatage d'un fuseau horaire à un autre. Très utile pour stocker les horodatages des utilisateurs de différents fuseaux horaires dans une base de données relationnelle. Pour les comparaisons de base de données, horodatage de la banque en UTC et utilisation avec gmdate('Y-m-d H:i:s')
/**
* Convert Datetime from any given olsonzone to other.
* @return datetime in user specified format
*/
function datetimeconv($datetime, $from, $to)
{
try {
if ($from['localeFormat'] != 'Y-m-d H:i:s') {
$datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
}
$datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
$datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
return $datetime->format($to['localeFormat']);
} catch (\Exception $e) {
return null;
}
}
Utilisation:
$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta']; $to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC']; datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"