Herhangi bir kitaplık kullanmadan HİÇBİR ŞEKİLDE bir tarih zaman damgasını UTC'ye (sunucunun bulunduğu saat diliminden) dönüştürmek için kolay bir yola ihtiyacım var.
Yanıtlar:
GetTimezone ve setTimezone deneyin, örneğe bakın
(Ama bu bir Sınıf kullanıyor)
GÜNCELLEME:
Herhangi bir ders olmadan şöyle bir şey deneyebilirsiniz:
$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 />");
NOT: Saat dilimini de orijinaline geri ayarlamanız gerekebilir.
Verilen dizeden (yerel saat olarak yorumlanan) bir zaman damgası oluşturmak için strtotime'ı kullanın ve bunu, UTC tarihi geri biçimlendirilmiş olarak almak için gmdate kullanın.
İstendiği gibi, işte basit bir örnek:
echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
DateTime kullanarak:
$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
Bu şekilde yapın:
gmdate('Y-m-d H:i:s', $timestamp)
ya da sadece
gmdate('Y-m-d H:i:s')
UTC'de "ŞİMDİ" almak için.
Referansı kontrol edin:
YYYY-MM-HH dd: mm: ss biçiminde bir tarihiniz varsa, php'yi "datetime dizgenizin" sonuna bir UTC ekleyerek kandırabilir ve dönüştürmek için strtotime'ı kullanabilirsiniz.
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";
Bu şunu yazdıracaktır:
2009-01-01 13:00:00
2009-06-01 14:00:00
Ve gördüğünüz gibi gün ışığından yararlanma saati sorununu da hallediyor.
Çözmenin biraz tuhaf yolu .... :)
:D
Yerel saat dilimi dizesini UTC dizesine dönüştürün.
örneğin Yeni Zelanda Saat Dilimi
$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);
PHP 5.2.0'dan beri mevcut olan PHP'nin DateTime sınıfını kullanmaktan çekinmiyorsanız, durumunuza uyan birkaç senaryo vardır:
$givenDt
UTC'ye dönüştürmek istediğiniz bir DateTime nesneniz varsa, bu onu UTC'ye dönüştürecektir:
$givenDt->setTimezone(new DateTimeZone('UTC'));
Orijinale $givenDt
daha sonra ihtiyaç duyarsanız, alternatif olarak, klonlanan nesneyi dönüştürmeden önce belirli DateTime nesnesini klonlamak isteyebilirsiniz:
$utcDt = clone $givenDt;
$utcDt->setTimezone(new DateTimeZone('UTC'));
Yalnızca bir tarih saat dizeniz varsa, örneğin $givenStr = '2018-12-17 10:47:12'
, önce bir tarih saat nesnesi oluşturursunuz ve sonra onu dönüştürürsünüz. Bunun $givenStr
PHP'nin yapılandırılmış zaman diliminde olduğunu varsaydığına dikkat edin .
$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
Verilen tarih saat dizesi PHP yapılandırmanızdakinden farklı bir zaman dilimindeyse, doğru saat dilimini sağlayarak tarih saat nesnesini oluşturun ( PHP'nin desteklediği saat dilimlerinin listesine bakın ). Bu örnekte, Amsterdam'daki yerel saat dilimini varsayıyoruz:
$givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
$givenDt->setTimezone(new DateTimeZone('UTC'));
Olarak strtotime belirli giriş biçimi gerektirir DateTime :: createFromFormat kullanılabilir ( php 5.3+ gereklidir )
// 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);
Bazen bu yöntemi kullanıyorum:
// 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"));
Çalışır bütün EN zaman.
http://php.net/manual/en/function.strtotime.php veya bir dizge değil de zaman bileşenleri kullanmanız gerekiyorsa, http://us.php.net/manual/en/function.mktime. php
PHP 5 veya üstü ile, datetime :: format işlevini kullanabilirsiniz ( http://us.php.net/manual/en/datetime.format.php belgelerine bakın )
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
Herhangi bir saat diliminden diğerine herhangi bir zaman damgasını biçimlendirmek için genel amaçlı normalleştirme işlevi. İlişkisel bir veritabanında farklı zaman dilimlerindeki kullanıcıların tarih damgalarını depolamak için çok kullanışlıdır. Veritabanı karşılaştırmaları için zaman damgasını UTC olarak saklayın vegmdate('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;
}
}
Kullanım:
$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"
alternatif olarak şunu deneyebilirsiniz:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>
bu çıktı:
2017-10-25 17:13:20 Asya / Singapur
Yalnızca salt okunur bir tarihi görüntülemek istiyorsanız, bunu bir metin giriş kutusunun değer özelliği içinde kullanabilirsiniz.
Bölgenizi / ülkenizi göstermek istemiyorsanız 'e'yi kaldırın.
Almak için aşağıdaki adımları izleyin UTC zamanı arasında herhangi diliminin kullanıcının yerel sistemde set (web uygulamaları UTC farklı saat dilimleri kaydetmek için bu gerekli olacaktır):
Javascript (istemci tarafı):
var dateVar = new Date();
var offset = dateVar.getTimezoneOffset();
//getTimezoneOffset - returns the timezone difference between UTC and Local Time
document.cookie = "offset="+offset;
Php (sunucu tarafı):
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)
Phill Pafford'un cevabında bir gelişme olarak ('Yd-mTG: i: sz' ifadesini anlamadım ve saat dilimine geri dönmeyi önerdi). Bu yüzden bunu öneriyorum (HMTL formatını düz / metin olarak değiştirerek karmaşık hale getirdim ...):
<?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
Varsayılan saat dilimini UTC olarak değiştirmek yerine kullanmalısınız . Çünkügmdate
otomatik olarak UTC kullanır.