web-dev-qa-db-fra.com

php convertit date/heure en UTC

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.

76
Jeremey

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.

28
Phill Pafford

Utilisez strtotime pour générer un horodatage à partir de la chaîne donnée (interprétée comme heure locale) et utilisez gmdate pour l’obtenir en tant que date et heure UTC formatée.

Exemple

Comme demandé, voici un exemple simple:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
98
poke

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
55
joerx

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:

http://www.php.net/manual/en/function.gmdate.php

19
Attilio

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 .... :)

13
Johan

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);
4
Christos Pontikis

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.

4
aorcsik

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);
  • NZDT: UTC + 13: 00
    if $ datetime = "2016-02-01 00:00:01", $ output = "2016-01-31 11:00:01";
    if $ datetime = "2016-02-29 23:59:59", $ output = "2016-02-29 10:59:59";
  • NZST: UTC + 12: 00
    if $ datetime = "2016-05-01 00:00:01", $ output = "2016-04-30 12:00:01";
    if $ datetime = "2016-05-31 23:59:59", $ output = "2016-05-31 11:59:59";

https://en.wikipedia.org/wiki/Time_in_New_Zealand

3
Frank Hou

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
1
MUY Belgium

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

1
psychotik

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:

  1. Si vous avez un objet $givenDt DateTime que vous souhaitez convertir en UTC, il sera converti en UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. 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'));
    
  3. 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'));
    
  4. 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'));
    
0
The Coprolal

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.

0
Bruce Tong

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):

  1. 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;
    
  2. 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

0
StevieJ

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"; 
?>
0
7Tonin

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"
0
Sandeep