php converte datetime in UTC


90

Ho bisogno di un modo semplice per convertire un indicatore di data e ora in UTC (da qualunque fuso orario si trovi il server) SPERANMENTE senza utilizzare alcuna libreria.

Risposte:


30

Prova getTimezone e setTimezone , guarda l'esempio

(Ma questo usa una classe)

AGGIORNARE:

Senza classi potresti provare qualcosa di simile:

$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 />");

NOTA: potrebbe essere necessario reimpostare anche il fuso orario sull'originale


55
Dovresti semplicemente usare gmdateinvece di cambiare il fuso orario predefinito in UTC. Perché gmdateutilizza automaticamente UTC.
colpisci il

29
-1 perché non vuoi cambiare il fuso orario predefinito globale per questo. Chiede solo effetti collaterali indesiderati.
Ward Bekker

@Phill Cosa significa "sz" qui?
Shahid Karimi

2
Penso che dovrebbe essere "Ym-dTG ..." invece di "Yd-mTG ..."
Alex Angelico

Non funziona per me nel progetto Laravel. Il suo ritorno la stessa data
Dharmender Tuli

109

Usa strtotime per generare un timestamp dalla stringa data (interpretata come ora locale) e usa gmdate per ottenerlo come una data UTC formattata.

Esempio

Come richiesto, ecco un semplice esempio:

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

7
Un piccolo esempio forse?
cherouvim

2
@cherouvim Non credo sia necessario, ma ne ho aggiunto uno comunque ... Spero che aiuti.
colpisci

5
gmdate () è una di quelle funzioni PHP in cui vorrei essermi imbattuto molto tempo fa. nl2br, chiunque?
Charlie Schliesser

1
GMT e UTC non sono sempre gli stessi.
Jay Sheth

1
@poke GMT rispetta l'ora legale, UTC no ed è per questo che viene utilizzato in modo da non dover prendere in considerazione nient'altro
Necro

72

Utilizzando 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

La domanda dice di convertire un timestamp in un timestamp e DateTime non accetta un timestamp come input. Dovresti convertirlo in una stringa in qualche modo e poi riconvertirlo.
felwithe l'


14

Se hai una data in questo formato AAAA-MM-HH gg: mm: ss, puoi effettivamente ingannare php aggiungendo un UTC alla fine della tua "stringa datetime" e usare strtotime per convertirlo.

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";

Questo stamperà questo:

2009-01-01 13:00:00
2009-06-01 14:00:00

E come puoi vedere, si occupa anche del problema dell'ora legale.

Un modo un po 'strano per risolverlo .... :)


Non capisco davvero perché l'OP non abbia scelto il tuo suggerimento:D
php_nub_qq

@php_nub_qq probabilmente perché funziona cambiando il fuso orario per l'intero script, il che potrebbe non essere desiderato e potrebbe avere conseguenze impreviste.
felwithe il

@felwithe Non lo farebbe se saltassi la prima riga, che è solo per dimostrazione
php_nub_qq

11

Converti la stringa del fuso orario locale in una stringa UTC.
ad esempio, Fuso orario della Nuova Zelanda

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

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


5

Se non ti dispiace usare la classe DateTime di PHP , disponibile da PHP 5.2.0, ci sono diversi scenari che potrebbero adattarsi alla tua situazione:

  1. Se hai un $givenDtoggetto DateTime che desideri convertire in UTC, questo lo convertirà in UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. Se hai bisogno dell'originale in un $givenDtsecondo momento, in alternativa potresti voler clonare l'oggetto DateTime specificato prima della conversione dell'oggetto clonato:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. Se si dispone solo di una stringa datetime, ad esempio $givenStr = '2018-12-17 10:47:12', si crea prima un oggetto datetime, quindi lo si converte. Nota che questo presuppone che $givenStrsia nel fuso orario configurato da PHP.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. Se la stringa datetime data è in un fuso orario diverso da quello nella configurazione PHP, creare l'oggetto datetime fornendo il fuso orario corretto (vedere l' elenco dei fusi orari supportati da PHP ). In questo esempio assumiamo il fuso orario locale ad Amsterdam:

    $givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
    $givenDt->setTimezone(new DateTimeZone('UTC'));
    

4

Poiché strtotime richiede un formato di input specifico, è possibile utilizzare DateTime :: createFromFormat ( è richiesto php 5.3+ )

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

A volte uso questo metodo:

// 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"));

Funziona quasi tutto il tempo.


3
Due problemi qui. Per prima cosa non dovresti sottrarre, dovresti aggiungere l'offset. In secondo luogo, questo non funziona se il fuso orario locale è attualmente su DST e la data desiderata non è su DST. L'offset sarebbe stato disattivato di un'ora. O vice versa. Quindi sì, funziona la maggior parte delle volte, ma non sempre.
ajon



0

provare

data dell'eco ('F d Y', strtotime ('2010-01-19 00:00:00'));

produrrà:

19 gennaio 2010

è necessario modificare l'ora del formato per visualizzare altri output


0

Funzione di normalizzazione per scopi generali per formattare qualsiasi timestamp da qualsiasi fuso orario ad altro. Molto utile per archiviare datetimestamp di utenti di diversi fusi orari in un database relazionale. Per i confronti del database, memorizzare il timestamp come UTC e utilizzarlo congmdate('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;
    }
}

Utilizzo:

$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

in alternativa puoi provare questo:

<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>

questo produrrà:

25-10-2017 17:13:20 Asia / Singapore

è possibile utilizzarlo all'interno dell'attributo value di una casella di immissione di testo se si desidera visualizzare solo una data di sola lettura.

rimuovere la "e" se non si desidera mostrare la propria regione / paese.


0

Seguire questi passaggi per ottenere l' ora UTC di qualsiasi fuso orario impostato nel sistema locale dell'utente (ciò sarà necessario affinché le applicazioni Web salvano fusi orari diversi in UTC):

  1. Javascript (lato 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 (lato server):

    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)
    

-1

Come miglioramento della risposta di Phill Pafford (non ho capito il suo "Yd-mTG: i: sz" e ha suggerito di ripristinare il fuso orario). Quindi propongo questo (ho complicato cambiando il formato HMTL in plain / text ...):

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

2
Dovresti modificare la tua risposta per spiegare come questo migliora la risposta di Phil. Cosa hai modificato nel codice e perché è migliore?
Cody Grey

Cambiare il fuso orario PHP predefinito per convertire due timestamp è un trucco che funziona, ma non una soluzione elegante.
The Coprolal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.