Saya membutuhkan cara mudah untuk mengonversi cap waktu tanggal ke UTC (dari zona waktu mana pun server berada) DENGAN HARAPAN tanpa menggunakan pustaka apa pun.
Jawaban:
Coba getTimezone dan setTimezone , lihat contohnya
(Tapi ini memang menggunakan Kelas)
MEMPERBARUI:
Tanpa kelas apa pun, Anda dapat mencoba sesuatu seperti ini:
$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 />");
CATATAN: Anda mungkin perlu mengatur zona waktu kembali ke aslinya juga
Gunakan strtotime untuk menghasilkan stempel waktu dari string yang diberikan (ditafsirkan sebagai waktu lokal) dan gunakan gmdate untuk mendapatkannya sebagai tanggal kembali UTC yang diformat.
Seperti yang diminta, berikut ini contoh sederhana:
echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
Menggunakan 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
Lakukan dengan cara ini:
gmdate('Y-m-d H:i:s', $timestamp)
atau sederhananya
gmdate('Y-m-d H:i:s')
untuk mendapatkan "SEKARANG" di UTC.
Cek referensi:
Jika Anda memiliki tanggal dalam format ini YYYY-MM-HH hh: mm: ss, Anda sebenarnya dapat mengelabui php dengan menambahkan UTC di akhir "string datetime" dan menggunakan strtotime untuk mengubahnya.
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";
Ini akan mencetak ini:
2009-01-01 13:00:00
2009-06-01 14:00:00
Dan seperti yang Anda lihat, ini menangani masalah waktu musim panas juga.
Sedikit cara aneh untuk mengatasinya .... :)
:D
Ubah string zona waktu lokal menjadi string UTC.
mis. Zona Waktu Selandia Baru
$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);
Jika Anda tidak keberatan menggunakan kelas DateTime PHP , yang telah tersedia sejak PHP 5.2.0, maka ada beberapa skenario yang mungkin sesuai dengan situasi Anda:
Jika Anda memiliki $givenDt
objek DateTime yang ingin Anda ubah menjadi UTC, maka ini akan mengubahnya menjadi UTC:
$givenDt->setTimezone(new DateTimeZone('UTC'));
Jika Anda memerlukan yang asli $givenDt
nanti, Anda mungkin ingin mengkloning objek DateTime yang diberikan sebelum konversi objek kloning:
$utcDt = clone $givenDt;
$utcDt->setTimezone(new DateTimeZone('UTC'));
Jika Anda hanya memiliki string datetime, misalnya $givenStr = '2018-12-17 10:47:12'
, Anda terlebih dahulu membuat objek datetime, lalu mengubahnya. Perhatikan ini mengasumsikan bahwa $givenStr
dalam zona waktu yang dikonfigurasi PHP.
$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
Jika string datetime yang diberikan berada di beberapa zona waktu berbeda dari yang ada di konfigurasi PHP Anda, buat objek datetime dengan menyediakan zona waktu yang benar (lihat daftar zona waktu yang didukung PHP ). Dalam contoh ini kami mengasumsikan zona waktu lokal di Amsterdam:
$givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
$givenDt->setTimezone(new DateTimeZone('UTC'));
Karena strtotime membutuhkan format input tertentu, DateTime :: createFromFormat dapat digunakan ( diperlukan 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);
Saya terkadang menggunakan metode ini:
// 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"));
Bekerja semua PALING waktu.
http://php.net/manual/en/function.strtotime.php atau jika Anda tidak perlu menggunakan string melainkan komponen waktu, maka http://us.php.net/manual/en/function.mktime. php
Dengan PHP 5 atau lebih tinggi, Anda dapat menggunakan fungsi datetime :: format (lihat dokumentasi 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
Fungsi normalisasi tujuan umum untuk memformat stempel waktu apa pun dari zona waktu mana pun ke zona waktu lainnya. Sangat berguna untuk menyimpan stempel waktu data pengguna dari zona waktu yang berbeda dalam database relasional. Untuk perbandingan database, simpan stempel waktu sebagai UTC dan gunakan dengangmdate('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;
}
}
Pemakaian:
$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"
sebagai alternatif, Anda dapat mencoba ini:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>
ini akan menghasilkan:
2017-10-25 17:13:20 Asia / Singapura
Anda dapat menggunakan ini di dalam atribut nilai dari kotak input teks jika Anda hanya ingin menampilkan tanggal hanya-baca.
hapus 'e' jika Anda tidak ingin menunjukkan wilayah / negara Anda.
Ikuti langkah-langkah berikut untuk mendapatkan waktu UTC dari zona waktu mana pun yang disetel dalam sistem lokal pengguna (Ini akan diperlukan aplikasi web untuk menyimpan zona waktu yang berbeda ke UTC):
Javascript (sisi klien):
var dateVar = new Date();
var offset = dateVar.getTimezoneOffset();
//getTimezoneOffset - returns the timezone difference between UTC and Local Time
document.cookie = "offset="+offset;
Php (sisi 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)
Sebagai perbaikan atas jawaban Phill Pafford (saya tidak mengerti 'Yd-mTG: i: sz' miliknya dan dia menyarankan untuk mengembalikan zona waktu). Jadi saya usulkan ini (saya rumit dengan mengubah format HMTL menjadi 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
alih-alih mengubah zona waktu default ke UTC. Karenagmdate
otomatis menggunakan UTC.