php mengkonversi datetime ke UTC

90

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.

Jeremey
sumber

Jawaban:

30

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

Phill Pafford
sumber
55
Anda sebaiknya menggunakan gmdatealih-alih mengubah zona waktu default ke UTC. Karena gmdateotomatis menggunakan UTC.
colek
30
-1 karena Anda tidak ingin mengubah zona waktu default global untuk ini. Itu hanya meminta efek samping yang tidak diinginkan.
Ward Bekker
@Phill Apa 'sz' di sini?
Shahid Karimi
2
Saya pikir seharusnya "Ym-dTG ..." bukan "Yd-mTG ..."
Alex Angelico
Ini tidak bekerja untuk saya dalam proyek laravel. Kembalinya pada tanggal yang sama
Dharmender Tuli
109

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.

Contoh

Seperti yang diminta, berikut ini contoh sederhana:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
menyodok
sumber
7
Contoh kecil mungkin?
cherouvim
2
@cherouvim Tidak berpikir itu perlu, tapi tetap menambahkan satu ... Semoga membantu.
aduk
5
gmdate () adalah salah satu fungsi PHP yang saya harap sudah lama saya temukan. nl2br, siapa?
Charlie Schliesser
1
GMT dan UTC tidak selalu sama.
Jay Sheth
1
@poke GMT menghormati waktu musim panas, UTC tidak dan itulah mengapa itu digunakan sehingga Anda tidak perlu memperhitungkan hal lain
Necro
72

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
joerx
sumber
Pertanyaannya mengatakan ubah stempel waktu menjadi stempel waktu, dan DateTime tidak menerima stempel waktu sebagai input. Anda harus mengubahnya menjadi string entah bagaimana kemudian mengubahnya kembali.
felwithe
22

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:

http://www.php.net/manual/en/function.gmdate.php

Attilio
sumber
14

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

Johan
sumber
Saya benar-benar tidak mengerti mengapa OP tidak memilih saran Anda:D
php_nub_qq
@php_nub_qq mungkin karena berfungsi dengan mengubah zona waktu untuk seluruh skrip, yang mungkin tidak diinginkan dan dapat menimbulkan konsekuensi yang tidak diinginkan.
felwithe
@felwithe Tidak akan jika Anda melewatkan baris pertama, yang hanya untuk demonstrasi
php_nub_qq
11

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

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:

  1. Jika Anda memiliki $givenDtobjek DateTime yang ingin Anda ubah menjadi UTC, maka ini akan mengubahnya menjadi UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. Jika Anda memerlukan yang asli $givenDtnanti, Anda mungkin ingin mengkloning objek DateTime yang diberikan sebelum konversi objek kloning:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. 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 $givenStrdalam zona waktu yang dikonfigurasi PHP.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. 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'));
    
Koprolal
sumber
4

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

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.

aorcsik.dll
sumber
3
Ada dua masalah di sini. Pertama, Anda tidak harus mengurangi Anda harus menambahkan offset. Kedua, ini tidak berfungsi jika zona waktu lokal saat ini ada di DST dan tanggal yang diinginkan tidak ada di DST. Offset akan meleset satu jam. Atau sebaliknya. Jadi ya, ini berfungsi paling banyak, tetapi tidak selalu.
ajon
1

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
MUY Belgia
sumber
0

mencoba

tanggal gema ('F d Y', strtotime ('2010-01-19 00:00:00'));

akan mengeluarkan:

19 Januari 2010

Anda harus mengubah waktu format untuk melihat keluaran lainnya

StevieJ
sumber
0

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"
Sandeep
sumber
0

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.

Bruce Tong
sumber
0

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

  1. 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;
    
  2. 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)
    
Pradeep Kumar Prabaharan
sumber
-1

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"; 
?>
7Tonin
sumber
2
Anda harus mengedit jawaban Anda untuk menjelaskan bagaimana ini meningkatkan jawaban Phil. Apa yang Anda ubah dalam kode, dan mengapa lebih baik?
Cody Gray
Mengubah zona waktu default PHP untuk mengonversi dua cap waktu adalah peretasan yang berfungsi, tetapi bukan solusi yang elegan.
The Coprolal