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) AVEC ESPOIR sans utiliser de bibliothèques.
Réponses:
Essayez le getTimezone et le setTimezone , voir l'exemple
(Mais cela utilise une classe)
MISE À JOUR:
Sans aucun 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
Faites 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 en fait 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 voir, il s'occupe également du problème de l'heure d'été.
Une façon un peu étrange de le résoudre .... :)
:D
Convertit la chaîne de fuseau horaire local en chaîne UTC.
par exemple, le 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);
Si cela ne vous dérange pas d'utiliser la classe DateTime de PHP , disponible depuis PHP 5.2.0, alors il existe plusieurs scénarios qui pourraient convenir à votre situation:
Si vous avez un $givenDt
objet DateTime que vous souhaitez convertir en UTC, cela le convertira en UTC:
$givenDt->setTimezone(new DateTimeZone('UTC'));
Si vous avez besoin de l'original $givenDt
plus tard, vous pouvez également cloner l'objet DateTime donné avant la conversion de l'objet cloné:
$utcDt = clone $givenDt;
$utcDt->setTimezone(new DateTimeZone('UTC'));
Si vous n'avez qu'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
c'est dans le fuseau horaire configuré par PHP.
$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
Si la chaîne datetime donnée se trouve 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 des fuseaux horaires pris en charge par PHP ). Dans cet exemple, nous supposons le fuseau horaire local à Amsterdam:
$givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
$givenDt->setTimezone(new DateTimeZone('UTC'));
Comme strtotime nécessite un format d'entrée spécifique, DateTime :: createFromFormat peut ê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"));
Fonctionne tous PLUPART du temps.
http://php.net/manual/en/function.strtotime.php ou si vous ne devez pas utiliser une chaîne mais des composants de temps à la place, alors http://us.php.net/manual/en/function.mktime. php
Avec PHP 5 ou supérieur, vous pouvez utiliser la fonction datetime :: format (voir documentation http://us.php.net/manual/en/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
Fonction de normalisation à usage général pour formater n'importe quel horodatage de n'importe quel fuseau horaire à l'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 bases de données, stockez l'horodatage au format UTC et utilisez avecgmdate('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;
}
}
Usage:
$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"
Sinon, vous pouvez essayer ceci:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>
cela produira:
2017-10-25 17:13:20 Asie / Singapour
vous pouvez l'utiliser 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 n'importe quel 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 en 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)
Pour améliorer la réponse de Phill Pafford (je n'ai pas compris son 'Yd-mTG: i: sz' et il a suggéré de revenir au fuseau horaire). Je propose donc ceci (j'ai compliqué en changeant 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";
?>
gmdate
au lieu de changer le fuseau horaire par défaut en UTC. Parce quegmdate
utilise automatiquement UTC.