PHP는 datetime을 UTC로 변환


90

라이브러리를 사용하지 않고 HOPEFULLY (서버가있는 시간대에 관계없이) 날짜 타임 스탬프를 UTC로 변환하는 쉬운 방법이 필요합니다.

답변:


30

getTimezone 및 setTimezone을 시도하고 예제를 참조하십시오.

(하지만 이것은 클래스를 사용합니다)

최신 정보:

수업이 없으면 다음과 같이 시도 할 수 있습니다.

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

참고 : 시간대를 원래대로 다시 설정해야 할 수도 있습니다.


55
gmdate기본 시간대를 UTC로 변경하는 대신 사용해야 합니다. gmdate자동으로 UTC를 사용 하기 때문 입니다.
찌르기

30
-1 글로벌 기본 시간대를 변경하지 않기 때문입니다. 의도하지 않은 부작용을 요구합니다.
Ward Bekker

@Phill 여기서 'sz'는 무엇입니까?
샤 히드 카리미

2
나는 대신 "내지 Ym-DTG ..." "야드 MTG ..."해야한다고 생각
알렉스 안젤리

laravel 프로젝트에서 나를 위해 작동하지 않습니다. 그 같은 날짜 반환
Dharmender 툴리

109

strtotime 을 사용 하여 주어진 문자열 (현지 시간으로 해석 됨)에서 타임 스탬프를 생성하고 gmdate 를 사용 하여 형식화 된 UTC 날짜로 되돌립니다.

요청에 따라 다음은 간단한 예입니다.

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

7
작은 예일까요?
cherouvim

2
@cherouvim 필요하다고 생각하지 않지만 어쨌든 추가했습니다… 도움이되기를 바랍니다.
poke

5
gmdate ()는 내가 오래 전에 우연히 만났 으면하는 PHP 함수 중 하나입니다. nl2br, 누구?
Charlie Schliesser

1
GMT와 UTC가 항상 같지는 않습니다.
Jay Sheth

1
@poke GMT 존중 일광 절약 시간제, UTC하지 않습니다과를 사용하는 이유는 당신의 다른 요인 아무것도 필요 없다 그래서
네크로

72

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

질문은 타임 스탬프를 타임 스탬프로 변환하고 DateTime은 타임 스탬프를 입력으로 받아들이지 않는다고 말합니다. 어떻게 든 문자열로 변환 한 다음 다시 변환해야합니다.
felwithe


14

이 형식의 날짜가 YYYY-MM-HH dd : mm : ss 인 경우 실제로 "datetime 문자열"끝에 UTC를 추가하고 strtotime을 사용하여 변환하여 PHP를 속일 수 있습니다.

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

다음과 같이 인쇄됩니다.

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

보시다시피 일광 절약 시간 문제도 처리합니다.

그것을 해결하는 약간 이상한 방법 .... :)


영업 이익이 당신의 제안을 선택하지 않은 이유를 진정으로 이해하지 않는다:D
php_nub_qq

@php_nub_qq는 아마도 전체 스크립트의 시간대를 변경하여 작동하기 때문에 바람직하지 않을 수 있으며 의도하지 않은 결과를 초래할 수 있습니다.
felwithe

@felwithe 데모 용인 첫 번째 줄을 건너 뛰면 안됩니다.
php_nub_qq

11

현지 시간대 문자열을 UTC 문자열로 변환합니다.
예 : 뉴질랜드 시간대

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

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


6

PHP 5.2.0부터 사용할 수있는 PHP의 DateTime 클래스를 사용해도 괜찮다 면 상황에 맞는 몇 가지 시나리오가 있습니다.

  1. 당신이 경우 $givenDt당신은 UTC로 변환 할 것을 DateTime 개체를 다음이 UTC로 변환합니다 :

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. $givenDt나중에 원본이 필요한 경우 복제 된 개체를 변환하기 전에 지정된 DateTime 개체를 복제 할 수도 있습니다.

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. datetime 문자열 만있는 경우 (예 $givenStr = '2018-12-17 10:47:12':) 먼저 datetime 객체를 만든 다음 변환합니다. 이것은 $givenStrPHP의 구성된 시간대에 있다고 가정 합니다.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. 주어진 datetime 문자열이 PHP 구성의 시간대와 다른 시간대에있는 경우 올바른 시간대를 제공하여 datetime 객체를 만듭니다 ( PHP가 지원하는 시간대 목록 참조 ). 이 예에서는 암스테르담의 현지 시간대를 가정합니다.

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

4

마찬가지로 , strtotime으로는 특정 입력 형식을 요구, 날짜 시간 :: createFromFormat이 사용될 수있다 ( 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

나는 때때로이 방법을 사용합니다.

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

대부분 의 경우 작동 합니다 .


3
여기에 두 가지 문제가 있습니다. 먼저 빼면 안되며 오프셋을 더해야합니다. 둘째, 현지 시간대가 현재 DST에 있고 원하는 날짜가 DST에 없으면 작동하지 않습니다. 오프셋은 한 시간 떨어져 있습니다. 혹은 그 반대로도. 예, 이것은 대부분의 경우 작동하지만 항상 그런 것은 아닙니다.
ajon



0

시험

echo date ( 'F d Y', strtotime ( '2010-01-19 00:00:00'));

다음을 출력합니다.

2010 년 1 월 19 일

다른 출력을 보려면 형식 시간을 변경해야합니다.


0

모든 시간대에서 다른 시간대로 모든 타임 스탬프를 형식화하는 범용 정규화 기능. 관계형 데이터베이스에 다른 시간대의 사용자 날짜 타임 스탬프를 저장하는 데 매우 유용합니다. 데이터베이스 비교를 위해 타임 스탬프를 UTC로 저장하고gmdate('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;
    }
}

용법:

$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

또는 이것을 시도 할 수 있습니다.

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

다음과 같이 출력됩니다.

2017-10-25 17:13:20 아시아 / 싱가포르

읽기 전용 날짜 만 표시하려는 경우 텍스트 입력 상자의 값 속성 내에서 사용할 수 있습니다.

지역 / 국가를 표시하지 않으려면 'e'를 제거하십시오.


0

사용자의 로컬 시스템에 설정된 시간대UTC 시간 을 얻으려면 다음 단계를 따르십시오 (웹 응용 프로그램이 다른 시간대를 UTC에 저장하는 데 필요함).

  1. 자바 스크립트 (클라이언트 측) :

    var dateVar = new Date();
    var offset = dateVar.getTimezoneOffset();
    //getTimezoneOffset - returns the timezone difference between UTC and Local Time
    document.cookie = "offset="+offset;
    
  2. PHP (서버 측) :

    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

Phill Pafford의 답변 에 대한 개선으로 (나는 그의 'Yd-mTG : i : sz'를 이해하지 못했고 그는 시간대를 되돌릴 것을 제안했습니다). 그래서 나는 이것을 제안합니다 (일반 / 텍스트로 HMTL 형식을 변경하여 복잡합니다 ...) :

<?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
이것이 Phil의 답변에서 어떻게 개선 되는지 설명하기 위해 답변을 편집 해야 합니다 . 코드에서 무엇을 변경했으며 왜 더 나은가요?
Cody Gray

두 개의 타임 스탬프를 변환하기 위해 기본 PHP 시간대를 변경하는 것은 작동하지만 우아한 솔루션은 아닙니다.
The Coprolal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.