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:
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
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
Fai in questo modo:
gmdate('Y-m-d H:i:s', $timestamp)
o semplicemente
gmdate('Y-m-d H:i:s')
per ottenere "NOW" in UTC.
Controlla il riferimento:
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 .... :)
:D
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);
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:
Se hai un $givenDt
oggetto DateTime che desideri convertire in UTC, questo lo convertirà in UTC:
$givenDt->setTimezone(new DateTimeZone('UTC'));
Se hai bisogno dell'originale in un $givenDt
secondo momento, in alternativa potresti voler clonare l'oggetto DateTime specificato prima della conversione dell'oggetto clonato:
$utcDt = clone $givenDt;
$utcDt->setTimezone(new DateTimeZone('UTC'));
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 $givenStr
sia nel fuso orario configurato da PHP.
$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
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'));
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);
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.
http://php.net/manual/en/function.strtotime.php o se non hai bisogno di usare una stringa ma invece di componenti temporali, allora http://us.php.net/manual/en/function.mktime. php
Con PHP 5 o superiore, puoi usare la funzione datetime :: format (vedi la documentazione 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
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"
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.
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):
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;
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)
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";
?>
gmdate
invece di cambiare il fuso orario predefinito in UTC. Perchégmdate
utilizza automaticamente UTC.