2012-02-12 10 views
0

나는 datetime에 생성 된 필드와 timestamp에 수정 된 필드를 가지고 있습니다. 나는 로스 앤젤레스 시간에 같은 시간에 날짜와 타임 스탬프를 참조 새 레코드를 생성하지만 난 타임 스탬프 필드는 UTC에있을 것으로 예상 할 때 이 내 코드타임 스탬프는 UTC로 유지되지 않습니다

date_default_timezone_set('America/Los_Angeles'); 
if ($this->isNewRecord) 
$this->created = date("Y-m-d h:i:s"); 
$this->modified = date("Y-m-d h:i:s"); 

입니다. 내가 날짜 필드 같은 경우 의미 '.. 8시 0분 0초'타임 스탬프는 '16해야한다 : 00 : 00 '미국 시간 (UTC -08 : 00)이기 때문에 DOC

TIMESTAMP 값을 말한다

+1

을 위해 :

여기


MySQL docs about handling timezones 추가합니다. *** 올바른 *** 시간대 처리는 특히 데이터베이스 서버가 방정식으로 들어갈 때 많은 노력이 필요한 문제입니다. 명확한 질문은 없다는 것을 이해합니다. 그러나이 경우 OP가 얻고있는 것을 파악하기 위해 많은 정보를 얻지는 못합니다. – rdlowrey

+0

아마도 영어가 나쁘기 때문에 질문이 명확하지 않습니다. – user677900

+1

a.v. 아마도 MySQL의 데이터 유형에 관한 질문을 충분히 명확히하지 않았을 것입니다. – Mchl

답변

4

TIMESTAMP 실제로 fieds는 저장을 위해 UTC 으로 변환됩니다. 즉,이 방법으로 저장되지만 선택하면 연결의 시간대로 변환됩니다. 실험을 할 수 있습니다 : 시간대 (아래 참조)를 다른 것으로 변경하고 해당 시간 소인을 선택하십시오. 일부 콘솔 출력을 그림

나는 내가 downvote에 동의 확실하지 않다
mysql> use test 
Database changed 
mysql> -- Let s see what is the current timezone setting on this server 
mysql> SELECT @@global.time_zone, @@session.time_zone; 
+--------------------+---------------------+ 
| @@global.time_zone | @@session.time_zone | 
+--------------------+---------------------+ 
| SYSTEM    | SYSTEM    | 
+--------------------+---------------------+ 
1 row in set (0.00 sec) 

mysql> -- I don t know what SYSTEM is set to, so just to be safe I ll set it to my timezone 
mysql> set time_zone = '+01:00'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @@global.time_zone, @@session.time_zone; 
+--------------------+---------------------+ 
| @@global.time_zone | @@session.time_zone | 
+--------------------+---------------------+ 
| SYSTEM    | +01:00    | 
+--------------------+---------------------+ 
1 row in set (0.00 sec) 

mysql> -- Let s create a table for or test  
mysql> create table testTimestamp (ts timestamp); 
Query OK, 0 rows affected (0.28 sec) 

mysql> -- Now to insert current time into the test table 
mysql> insert into testTimestamp values (now()); 
Query OK, 1 row affected (0.01 sec) 

mysql> -- Let s see how it looks like 
mysql> select * from testTimestamp; 
+---------------------+ 
| ts     | 
+---------------------+ 
| 2012-02-13 00:12:00 | 
+---------------------+ 
1 row in set (0.03 sec) 

mysql> -- Now let s change session timezone to Los Angeles time 
mysql> set time_zone = '-08:00'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> -- And let s look at our timestamp once again 
mysql> select * from testTimestamp; 
+---------------------+ 
| ts     | 
+---------------------+ 
| 2012-02-12 15:12:00 | 
+---------------------+ 
1 row in set (0.00 sec) 
+0

하지만 지금은 "타임 스탬프가 저장 장치의 연결 시간대로 변환된다"는 것을 의미한다. 어떻게 데이터베이스 에서이 값을 확인 – user677900

+1

? MySQL에 의해 자동으로. 'SET time_zone = '-08 : 00'; 또는''SET time_zone = '+02 : 00';을 사용하거나 여러분이 좋아할 때마다'SELECT'의 차이점을 확인하십시오 – Mchl

+0

혼란 스럽습니다. 1 개의 질문이 더 있습니다. 내 예제 코드의 timestamp와 datetime 필드가 같은 시간에 나타나는 이유는 무엇입니까? – user677900

0

대신 date()

date()gmdate()를 사용해야합니다 저장 UTC 현재 시간대로 변환하는 것은 date_default_timezone_set()에 따라 결과 를 반환이고 gmdate()은 GMT/UTC에 따라 동일 을 수행합니다.

The standard way for switching from/to user_timezone and gmt을 참조하십시오.

+0

죄송합니다, 왜 그런지 모르겠지만 내 대답은 downvoted되었습니다! 나는 a.v의 문제가 이런 방식으로 해결되어야한다고 생각한다. 그의 경우에는'date'를 사용하는 것이 잘못되어'gmdate'를 사용해야합니다. 투표에 대한 명확한 설명에 감사드립니다. 그 이유는 결과 자체보다 더 중요하다고 생각합니다! –

+1

downvote하지 않았지만, 나는 OP의 명확하지 않은 질문의 희생자라고 생각합니다. 그는 PHP에 관한 답변을하는 동안 실제로 MySQL 데이터 유형에 대해 묻고있었습니다. 행운을 빌어. 나는 당신의 답을 다른 질문에서 다시 검토하고 +1을 줄 수 있는지 알아 보도록하겠다.) – Mchl

관련 문제