Вопрос по mysql, timezone, php – PHP & MySQL: преобразование сохраненного TIMESTAMP в локальный часовой пояс пользователя

13

Так что у меня есть сайт с функцией комментариев, где временная метка комментария хранится в базе данных MySQL. Из того, что я понимаю, отметка времени при сохранении преобразуется в UTC, а затем возвращается в часовой пояс по умолчанию при получении. В моем случае мой сервер находится в центральном часовом поясе дневного времени (CDT).

У меня есть план, чтобы получить часовой пояс от каждого пользователя через форму входа. Я просто хотел знать, как преобразовать значение TIMESTAMP в часовой пояс пользователя.

First, would I convert from UTC to local timezone? Or CDT to local timezone? Secondly, how would I go about doing that in PHP? Would I just do:
$userTimezone = new DateTimeZone($userSubmittedTimezoneString);
$myDateTime = new DateTime($storedTimestamp, $userTimezone);

... или это не правильно?

нет, временные метки хранятся как есть в mysql, но без каких-либо данных TZ. если вы вставите «3 часа дня, CST» в БД, затем в 3 часа дня, cst - это то, что хранится. Вам нужно преобразовать в UTC, прежде чем вставлять, чтобы у вас была общая неизменная база для преобразования в другие TZ. Marc B

Ваш Ответ

4   ответа
1

Не существует надежного способа получить часовой пояс пользователя. Информация о часовом поясе не отправляется в заголовках HTTP. Лучшее, что вы можете сделать, это либо:

  1. Match the IP address againsta geographic database -or-
  2. Use Javascript to get the time set on the user's computer and either send that to the server (AJAX) or make the time string on the client.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0
$timezone = new DateTimeZone('America/Vancouver');

$date = new DateTime(date('m/d/Y h:i:s a', time()));
$date->setTimeZone($timezone);
echo $date->format('l F j Y g:i:s A')."\n";

new DateTime(date('m/d/Y h:i:s a', time())); сnew DateTime("UTC Time");

Вы можете создать новыйDateTimeZone() объект для каждого пользовательского ввода.

20

редоставления. То есть если тыINSERT строка2012-04-17 12:03:23 вDATETIME столбец, это значение, которое будет сохранено. Он будет внутренне преобразован во временную метку, которая может быть или не быть точной (см. Ниже), но когда вы снова запросите значение, вы получите то же значение обратно; туда и обратно прозрачно.

Проблемы могут возникнуть, если вы попытаетесь выполнить вычисления времени внутри SQL. То есть любая операция, которая требует SQL для учета часового пояса и / или времени сервера. Например, используяNOW(), Для любой из этих операций, часовой пояс и / или серверное времяshould быть настроен правильно. УвидетьПроблемы с часовым поясом.

Если это не касается вас и вам нужно только выполнять вычисления в PHP, вам нужно только убедиться, что вы знаете, из какого часового пояса в какой часовой пояс вы хотите перейти. Для этогоcan Удобно стандартизировать все время по UTC, но это необязательно, поскольку преобразование часового пояса из любого часового пояса в любой другой часовой пояс работает так же хорошо, если вы четко указываете, в какой часовой пояс вы конвертируете из и в.

date_default_timezone_set('Asia/Tokyo'); // your reference timezone here

$date = date('Y-m-d H:i:s');

/* INSERT $date INTO database */;

$date = /* SELECT date FROM database */;

$usersTimezone = new DateTimeZone('America/Vancouver');
$l10nDate = new DateTime($date);
$l10nDate->setTimeZone($usersTimezone);
echo $l10nDate->format('Y-m-d H:i:s');
Error: User Rate Limit Exceededtimezone_offset_get(new DateTimeZone('Asia/Tokyo'), new Datetime()).
Error: User Rate Limit Exceededblog.benkuhl.com/2009/12/timezone-list-in-mysqlError: User Rate Limit ExceededTIMESTAMPError: User Rate Limit Exceeded TerranRich
Error: User Rate Limit Exceededstackoverflow.com/questions/4755704/php-timezone-listError: User Rate Limit Exceeded TerranRich
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededAmerica/New_YorkError: User Rate Limit ExceededcurrentError: User Rate Limit ExceededAmerica/New_YorkError: User Rate Limit Exceededstackoverflow.com/questions/1727077/…Error: User Rate Limit Exceeded TerranRich
0

что лучший способ сделать это - сохранить пользовательское GMT в своих cookie-файлах и извлечь его из формы процесса PHP.

<script language="javascript">

function TimeZoneCookie()
{
 var u_gmt = (-(new Date().getTimezoneOffset()))/60;
 var o_date = new Date("December 31, 2025");
 var v_cookie_date = o_date.toGMTString();
 var str_cookie = "utimezone="+u_gmt;
 str_cookie += ";expires=" + v_cookie_date;
 document.cookie=str_cookie;
}
//---------------------
TimeZoneCookie();

</script>

u_gmt пояснил:

Date().getTimezoneOffset() returns the offset to GMT-0 in minutes Since getTimezoneOffset() will return the offset to GMT-0 and not from GMT-0 we'll need to turn it around. How? simple, just by knowing that -*-=+ & -*+=-. If you know basic math, you already know this principle. As I said in step 1 getTimezoneOffset() will return the offset in minutes, so we just divide it by 60, so we can get the gmt offset format.

Result: (-(new Date().getTimezoneOffset()))/60

Теперь получите куки в PHP:

<?php

$user_timezone = $_COOKIE['utimezone'];

?>

Похожие вопросы