php convertit datetime en UTC

90

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.

Jeremey
la source

Réponses:

30

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

Phill Pafford
la source
55
Vous devriez simplement utiliser gmdateau lieu de changer le fuseau horaire par défaut en UTC. Parce que gmdateutilise automatiquement UTC.
poke le
30
-1 car vous ne souhaitez pas modifier le fuseau horaire global par défaut pour cela. Il demande simplement des effets secondaires involontaires.
Ward Bekker
@Phill Qu'est-ce que «sz» ici?
Shahid Karimi
2
Je pense que ça devrait être "Ym-dTG ..." au lieu de "Yd-mTG ..."
Alex Angelico
Cela ne fonctionne pas pour moi dans le projet laravel. Son retour à la même date
Dharmender Tuli
109

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 UTC formatée.

Exemple

Comme demandé, voici un exemple simple:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
poussée
la source
7
Un petit exemple peut-être?
cherouvim
2
@cherouvim Je ne pense pas que ce soit nécessaire, mais j'en ai quand même ajouté un ...
poke le
5
gmdate () est l'une de ces fonctions PHP sur lesquelles j'aurais aimé tomber il y a longtemps. nl2br, quelqu'un?
Charlie Schliesser
1
GMT et UTC ne sont pas toujours les mêmes.
Jay Sheth
1
@poke GMT respecte l'heure d'été, UTC ne le fait pas et c'est pourquoi il est utilisé pour que vous n'ayez rien à prendre en compte
Necro
72

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
Joerx
la source
La question dit convertir un horodatage en horodatage et DateTime n'accepte pas d'horodatage en entrée. Vous devrez le convertir en une chaîne, puis le reconvertir.
felwithe le
14

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

Johan
la source
Je ne comprends vraiment pas pourquoi le PO n'a pas choisi votre suggestion:D
php_nub_qq
@php_nub_qq probablement parce que cela fonctionne en changeant le fuseau horaire pour tout le script, ce qui pourrait ne pas être souhaité et avoir des conséquences inattendues.
felwithe
@felwithe Ce ne serait pas le cas si vous sautiez la première ligne, qui est juste pour la démonstration
php_nub_qq
11

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);
  • NZDT: UTC + 13: 00
    si $ 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
    si $ 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

Frank Hou
la source
5

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:

  1. Si vous avez un $givenDtobjet DateTime que vous souhaitez convertir en UTC, cela le convertira en UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. Si vous avez besoin de l'original $givenDtplus tard, vous pouvez également cloner l'objet DateTime donné avant la conversion de l'objet cloné:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. 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 $givenStrc'est dans le fuseau horaire configuré par PHP.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. 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'));
    
Le Coprolal
la source
4

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

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.

Aorcsik
la source
3
Deux problèmes ici. Tout d'abord, vous ne devez pas soustraire, vous devez ajouter le décalage. Deuxièmement, cela ne fonctionne pas si le fuseau horaire local est actuellement à l'heure d'été et que la date souhaitée n'est pas à l'heure d'été. Le décalage serait décalé d'une heure. Ou vice versa. Alors oui, cela fonctionne la plupart du temps, mais pas toujours.
ajon
1

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
MUY Belgique
la source
0

essayer

date d'écho ('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

StevieJ
la source
0

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

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.

Bruce Tong
la source
0

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

  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)
    
Pradeep Kumar Prabaharan
la source
-1

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"; 
?>
7Tonin
la source
2
Vous devriez modifier votre réponse pour expliquer comment cela améliore la réponse de Phil. Qu'avez-vous changé dans le code et pourquoi est-ce mieux?
Cody Gray
Changer le fuseau horaire PHP par défaut pour convertir deux horodatages est un hack qui fonctionne, mais pas une solution élégante.
The Coprolal le