시간대가있는 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.