시간대가있는 PHP date ()?


79

그래서 PHP에서 지원되는 시간대 목록을 확인했는데 어떻게 date()함수에 포함시킬 수 있는지 궁금합니다 . 감사!

나는 기본 시간대를 원하지 않으며 각 사용자는 자신의 시간대를 데이터베이스에 저장하고 사용자의 시간대를 사용하여 사용합니다. 어떻게? 나는 그것을 사용하는 방법이 아니라 데이터베이스에서 가져 오는 방법을 알고 있습니다.


시간대를 어떤 형식으로 저장합니까?
— revo

답변:


136

이러한 작업의 경우 실제로 PHP의 DateTime 클래스를 사용해야합니다. date () 또는 date_set_time_zone을 사용하도록 조언하는 모든 답변을 무시하십시오. 단순히 나쁘고 구식입니다.

시연을 위해 의사 코드를 사용할 것이므로 필요에 맞게 코드를 조정하십시오.

변수 $ tz에 유효한 시간대의 문자열 이름이 있고 변수 $ timestamp에 시간대에 따라 형식을 지정할 타임 스탬프가 포함되어 있다고 가정하면 코드는 다음과 같습니다.

$tz = 'Europe/London';
$timestamp = time();
$dt = new DateTime("now", new DateTimeZone($tz)); //first argument "must" be a string
$dt->setTimestamp($timestamp); //adjust the object to correct timestamp
echo $dt->format('d.m.Y, H:i:s');

DateTime 클래스는 강력하고 모든 기능을 이해하려면 php.net에서 이에 대해 읽는 데 시간을 투자해야합니다. 질문에 완전히 답하려면 시간대 매개 변수를 동적으로 조정할 수 있습니다 (db에서 읽는 동안 각 반복에서 새 DateTimeZone () 객체를 만들 수 있습니다).


1
@ Glavić-당신이 맞습니다, 나는 이것을 하지 않는 방법을 보여주기 위해 대답을 남겨 둘 것 입니다. 그러나 DateTime은 서버의 시간대를 조작하는 것보다 낫습니다. 이는 제가 지적하고 싶었지만 실패한 것입니다.
— NB

코드가 작동하지 않습니다. DateTime 생성자의 첫 번째 매개 변수는 문자열이어야합니다 [ php.net/manual/en/datetime.construct.php ]
— Alex

@Alex-네, 틀 렸습니다-제가 댓글을 달고 답을 남겼습니다. 내가 게으르지 않을 때 올바른 생성자를 포함하도록 답을 편집하겠습니다 :) (그동안 답을 편집 할 수 있습니다 너무?)
— NB

이미 'now'로 DateTime을 시작했기 때문에 타임 스탬프를 지금 타임 스탬프로 설정하는 이유는 무엇입니까?
— George Dimitriadis

@GeorgeDimitriadis는 코드 사용 방법의 예이기 때문입니다. 그것은 당신이 할 수 있는 일을 강조하는 목적으로 사용 됩니다. 이 경우에는 기본적으로 무의미하다고 말하는 것이 맞지만, 생성 된 DateTime객체 에서 타임 스탬프가 어떻게 변경 될 수 있는지 사람들이 볼 수 있도록 거기에 넣었습니다 .
— NB

38

내가 올바르게 이해했다면 먼저 다음과 같이 시간대를 설정해야합니다.

date_default_timezone_set('UTC');

그리고 날짜 기능을 사용할 수 있습니다.

// Prints something like: Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');

1
기본 시간대를 원하지 않습니다. 모든 사용자의 데이터베이스에 저장됩니다.
— user2917204

3
@ user2917204 MySQL을 사용하는 경우 TIMESTAMP데이터 유형으로 저장하십시오 . 백엔드에서 UTC로 저장하므로 선택한 시간대로 변환 할 수 있습니다.
— ceejayoz

MySQL을 사용하고 있는데 TIMESTAMP로 저장했습니다. 변환하는 데 필요한 코드는 무엇입니까?
— user2917204

1
@ user2917204 시간대를 설정하고 형식이 지정된 날짜를 뱉어 낸 다음 시간대를 되 돌리는 함수를 만듭니다. 많은 예제 stackoverflow.com/questions/11900126/… , stackoverflow.com/questions/7824038/… . DateTime 클래스는 또한 시간대 매개 변수 php.net/manual/en/class.datetime.php를
— Mike B

18

시간대를 지원하므로 대신 DateTime 클래스 를 사용하십시오 . 에 해당하는 DateTime은 date()입니다 DateTime::format.

DateTime의 매우 유용한 래퍼는 Carbon 입니다. 확실히 살펴보세요.

데이터베이스에 UTC로 저장하고 응용 프로그램 수준에서 변환 할 수 있습니다.


예, 그럴 수 있습니다. setTimezone()해당 클래스 의 기능을 사용하여 애플리케이션 로직에서이를 처리합니다 .
— 자요 즈

13

위 의 대답으로 인해 몇 가지 문제가 발생했습니다. 그래서 나를 위해 일한 클리너 코드를 게시하십시오.

$dt = new DateTime();
$dt->setTimezone(new DateTimeZone('America/New_York'));
$dt->setTimestamp(123456789);

echo $dt->format('F j, Y @ G:i');

8

다음과 같아야합니다.

date_default_timezone_set('America/New_York');

3
나는 기본 시간대를 원하지 않으며 각 사용자는 자신의 시간대를 데이터베이스에 저장하고 사용자의 시간대를 사용하여 사용합니다. 어떻게? 나는 그것을 사용하는 방법이 아니라 데이터베이스에서 가져 오는 방법을 알고 있습니다.
— user2917204

모든 사용자에 대해 기본 시간대를 생성하지 않고 현재 스크립트 만 생성합니다. 아마도 현재 사용자 1 명의 작업에 응답 할 것입니다.
— LStarky

3

이것은 2019에서 완벽하게 작동합니다.

date('Y-m-d H:i:s',strtotime($date. ' '.$timezone)); 

2

이 시도. 유닉스 타임 스탬프 또는 날짜 시간 문자열을 전달할 수 있습니다.

public static function convertToTimezone($timestamp, $fromTimezone, $toTimezone, $format='Y-m-d H:i:s') 
    {
        $datetime = is_numeric($timestamp) ?
                    DateTime::createFromFormat ('U' , $timestamp, new DateTimeZone($fromTimezone)) :
                    new DateTime($timestamp, new DateTimeZone($fromTimezone));

        $datetime->setTimezone(new DateTimeZone($toTimezone));

        return $datetime->format($format);
    }

2

U는 유닉스 타임 스탬프에 시간대 차이를 추가 할 수 있습니다. 모스크바의 예 (UTC + 3)

echo date('d.m.Y H:i:s', time() + 3 * 60 * 60);

1

이 매우 간단한 기능을 만들었으며 매력처럼 작동합니다.

function ts2time($timestamp,$timezone){ /* input: 1518404518,America/Los_Angeles */            
        $date = new DateTime(date("d F Y H:i:s",$timestamp));
        $date->setTimezone(new DateTimeZone($timezone));
        $rt=$date->format('M d, Y h:i:s a'); /* output: Feb 11, 2018 7:01:58 pm */
        return $rt;
    }

0

위에 언급되지 않았습니다. 생성자에 @ 기호가 붙은 문자열로 타임 스탬프를 제공하여 DateTime 객체를 생성 할 수도 있습니다.

$dt = new DateTime('@123456789');
$dt->setTimezone(new DateTimeZone('America/New_York'));
echo $dt->format('F j, Y - G:i');

복합 형식에 대한 설명서를 참조하십시오 : https://www.php.net/manual/en/datetime.formats.compound.php


-2

date_default_timezone_set 함수, date_default_timezone_set (SOME_PHP_VARIABLE)에서 데이터베이스 값을 바꿀 수 있습니다. 하지만 시간대와 관련된 정확한 값만 처리하면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.