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.