Америка / Центральное время в MySql не экономит правильное время - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь сохранить свои записи как центральное время в моей базе данных MySql. Но похоже, что время не так.

Field: added_on
Data type: TIMESTAMP
Default: CURRENT_TIMESTAMP

PHP:

$now = date('Y/m/d H:i:s' );
$date = new DateTime( $now, new DateTimeZone( 'America/Chicago' ) );

$sql = $conn->prepare( "INSERT INTO agent_notes
            (agent_code, account_code, agent_note, added_on)
            VALUES (?, ?, ?, ?)" );

$sql->execute( array( $agent_code, $account_code, $agent_note, $date ) );

Я имею в виду https://www.php.net/manual/en/timezones.america.php#114172

На момент публикации CST текущее время было 2:36 am, Wednesday, 29 April 2020
Дата, сохраненная в базе данных на моем сервере, была 7:36 am, Wednesday, 29 April 2020

Хотя я ожидал, что она будет такой же, как CST выше, т.е. 2:36 am, Wednesday, 29 April 2020

Сервер: GoDaddy

Что я делаю не так?

1 Ответ

3 голосов
/ 29 апреля 2020

Хранит правильное значение: метка времени в UT C. Если вы хотите преобразовать это обратно в местный часовой пояс при получении данных, вы можете сделать это, но поле TIMESTAMP в MySql не имеет часового пояса.

Из MySql Учебное пособие TIMESTAMP :

Когда вы вставляете значение TIMESTAMP в таблицу, MySQL преобразует его из часового пояса вашего соединения в UT C для хранения.

Аналогично справочной документации :

MySQL преобразует значения TIMESTAMP из текущего часового пояса в UT C для хранения и обратно из UT C к текущему часовому поясу для поиска. (Это не происходит для других типов, таких как DATETIME.) По умолчанию текущим часовым поясом для каждого соединения является время сервера. Часовой пояс может быть установлен для каждого соединения отдельно. Пока настройка часового пояса остается постоянной, вы получаете то же значение, которое храните.

Так что, если вы извлекаете данные из базы данных, используя соединение, которое указывает часовой пояс, вы должны вернуть его обратно в этот часовой пояс - но если вы просто просматриваете базу данных каким-либо другим способом или извлекаете ее без , указав часовой пояс в соединении, вы получите UT C.

Это вполне подходит для отметки времени. Это не всегда подходит для будущих дат и времени , но это другой вопрос.

...