programing

PHP/MySQL에서 날짜/시간을 UTC로 저장

goodsources 2022. 11. 20. 12:23
반응형

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();

★★★★★★★★★★★★★★★★★.datetimePHP를 사용합니다.PDO에 전달되는 것은 MySQL에서 인식되는 형식 중 하나로 UTC 시간대로 날짜를 나타내는 문자열일 뿐입니다., 날짜가 " " " 인 " 입니다.2015-10-21 19:32:33 UTC+2:00에 MySQL을 2015-10-21 17:32:33gmtdate("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

반응형