PHP/MySQL에서 날짜/시간을 UTC로 저장
시간을 사용자의 표준시간대로 변환하는 방법에 대해 읽을 때마다 가장 좋은 방법은 날짜와 시간을 UTC에 저장한 후 사용자의 표준시간 오프셋을 이 시간에 추가하는 것이라고 합니다.
UTC 시간으로 날짜를 저장하려면 어떻게 해야 하나요?MySQL DATETIME 필드를 사용합니다.
내 PHP 코드에서 MySQL에 새 레코드를 추가할 때 사용합니다.now()
MySQL DATETIME에 삽입합니다.
다른 것을 사용해야 합니까?now()
UTC 시간을 저장하시겠습니까?
MySQL: UTC_TIMESTAMP()
현재 UTC 날짜와 시간을 'YYY-MM-DD HH:MM:SS' 또는 YYYMMDDHHMMSS.uuuuu 형식(함수가 문자열 또는 숫자 컨텍스트에서 사용되는지에 따라 다름)
PHP: gmdate()
또한 PHP는 스크립트의 현재 시간대를 설정하기 위해 PHP에서 사용됩니다.모든 서식 함수가 자신의 현지 시간으로 시간을 반환하도록 클라이언트 표준 시간대로 설정할 수 있습니다.
사실, 난 이걸 작동시키는 데 어려움을 겪었고 항상 누군가와 마주쳤지만.예를 들어 MySQL에서 반환되는 시간 정보는 'UTC' 형식이 아니므로 주의하지 않으면 strtotime이 현지 시간으로 변환합니다.XML과 RSS/Atom을 고려하여 날짜가 미디어 경계(HTTP->PHP->MySQL 및 MySQL->PHP->HTTP)를 통과할 때 손상되지 않는 신뢰할 수 있는 솔루션을 가지고 있는지 알고 싶습니다.
UTC 시간대에 날짜를 삽입하는 것이 좋습니다.이것은 일광 절약 문제로 미래에 많은 두통을 덜어줄 것입니다.
INSERT INTO abc_table (registrationtime) VALUES (UTC_TIMESTAMP())
데이터를 쿼리할 때는 다음 PHP 스크립트를 사용합니다.
<?php
while($row = mysql_fetch_array($registration)) {
$dt_obj = new DateTime($row['message_sent_timestamp'] ." UTC");
$dt_obj->setTimezone(new DateTimeZone('Europe/Istanbul'));
echo $formatted_date_long=date_format($dt_obj, 'Y-m-d H:i:s');
}
?>
를 교환할 수 있습니다.DateTimeZone
사용 가능한 PHP 시간대 중 하나로 값을 지정합니다.
NOW()
는 데이터베이스를 실행하고 있는 시스템의 시간(타임존 오프셋 포함)을 나타냅니다.UTC 날짜/시간을 가져오려면UTC_TIMESTAMP()
MySQL 참조 설명서에 설명되어 있습니다.
https://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp
삭제 시 위 링크의 모든 답변을 인용합니다.
@ypercube의 코멘트에 따르기 위해서CURRENT_TIMESTAMP
는 UTC로 저장되지만 현재 타임존으로 취득됩니다. --default_time_zone 옵션을 사용하여 서버의 타임존 설정에 영향을 줄 수 있습니다.이것에 의해, 취득은 항상 UTC로 할 수 있습니다.
기본적으로 옵션은 'SYSTEM(시스템)'이며, 이는 시스템 표준 시간대가 설정되는 방법입니다(UTC가 될 수도 있고 아닐 수도 있음).
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
1 row in set (0.00 sec)
mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 16:28:45 |
+---------------------+
1 row in set (0.00 sec)
이것은 동적으로 설정할 수 있습니다.
mysql> SET @@session.time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | +00:00 |
+--------------------+---------------------+
1 row in set (0.00 sec)
또는 my.cnf:
[mysqld]
**other variables**
default_time_zone='+00:00'
서버를 재기동하면, 다음의 변경이 표시됩니다.
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00 | +00:00 |
+--------------------+---------------------+
1 row in set (0.00 sec)
mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 20:27:50 |
+---------------------+
1 row in set (0.01 sec)
@알 수 있듯이 를 UTC @Haluk로 할 수 .datetime
가 PHP 코드에서 온 을 보완하고 그 한 것에 PHP의 동작은 다음과 같습니다.PHP의 동작은 다음과 같습니다.
$pdo = new PDO('mysql:host=mydbname.mysql.db;dbname=mydbname', 'myusername', 'mypassword');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$insertStmt = $pdo->prepare("insert into test (last_modified)"
." values(:last_modified)");
$insertStmt->bindParam(':last_modified', $lastModified, PDO::PARAM_STR);
$lastModified = gmdate("Y-m-d H:i:s");
$insertStmt->execute();
★★★★★★★★★★★★★★★★★.datetime
PHP를 사용합니다.PDO에 전달되는 것은 MySQL에서 인식되는 형식 중 하나로 UTC 시간대로 날짜를 나타내는 문자열일 뿐입니다., 날짜가 " " " 인 " 입니다.2015-10-21 19:32:33 UTC+2:00
에 MySQL을 2015-10-21 17:32:33
gmtdate("Y-m-d H:i:s")
는 현재 날짜를 이러한 형식으로 제공합니다.어떤 경우에도 UTC 시간으로 삽입할 날짜를 나타내는 문자열을 작성하기만 하면 됩니다.
그런 다음 날짜를 읽을 때 방금 검색한 날짜의 시간대가 UTC임을 PHP에 알려야 합니다.Haluk의 답변에 있는 코드를 사용합니다.
덤::UTC_TIMESTAMP(6)
6자리 마이크로초의 시간으로 설정합니다.
MySQL 5.7 이상
언급URL : https://stackoverflow.com/questions/1349280/storing-datetime-as-utc-in-php-mysql
'programing' 카테고리의 다른 글
PHP에서 에코와 인쇄는 어떻게 다릅니까? (0) | 2022.11.29 |
---|---|
TypeError: 시퀀스 항목 0: 필요한 문자열, int를 찾았습니다. (0) | 2022.11.29 |
pom.xml 행 1에 알 수 없는 오류가 표시되는 이유는 무엇입니까? (0) | 2022.11.20 |
orderBy Angular의 여러 필드별 (0) | 2022.11.20 |
Laravel의 created_at 및 updated_at 이름 변경 (0) | 2022.11.20 |