Помощь по часовым поясам в PHP / MySQL - PullRequest
1 голос
/ 09 января 2010

Я уже несколько недель сражаюсь с битвой за часовой пояс, все думают, что знают решение, а потом они получают миллион голосов, но реальность такова, что я на 100% застрял, ответа на вопрос о поддержке часовых поясов в PHP / MySQL не последовало. сработал на 100% для меня, поэтому я снова задаю вопрос здесь настолько подробно, насколько это возможно, с примером кода и всем прочим.

Если вы являетесь экспертом по PHP / MySQL или даже новичком с безумной удачей и получили работающий часовой пояс php / mysql / user, то, пожалуйста, помогите.

Ниже приведено то, что у меня есть, пожалуйста, прочитайте комментарии, чтобы увидеть, какие у меня проблемы. По сути, я могу показать дату и время в часовом поясе пользователя, если оно имеет вид метки времени, например «1262819848», но НОВЫЕ версии MySQL вместо этого возвращают TIMESTAMP, подобный этому «2010-01-06 23:17:28» ,

Если бы я мог передать «2010-01-06 23:17:28» в эту дату («m: d: yh: i: s A», $ time_stamp), то все бы работало ОТЛИЧНО, но вместо этого ему нужна временная метка Единственное, что я могу сделать - это сохранить реальную метку времени в поле INTEGER в MySQL ИЛИ получить значение «2010-01-06 23:17:28», а затем преобразовать его в метку времени, которая выглядит просто нравится много накладных расходов, когда я могу сохранить их уже преобразованы в поле INT.

Если вы можете помочь мне использовать функции datetime, я был бы очень признателен за помощь, я застрял на этой проблеме в течение пары лет. Я собираюсь сдаться и использовать поле Integer, как все в SO говорят, что по какой-то причине плохо.

<?PHP
/////////////////////////////////////////////////////////
//   Get a MySQL time / date and show in user timezone //
////////////////////////////////////////////////////////

//set the user's time zone for this page
//this assumes the user has already chosen a timezone and we are getting it from a PHP session value now
// example value is "America/New_York" which is -5
date_default_timezone_set($_SESSION['time_zone']);

// get a MySQL result with a time/date value in it
$sql = 'SELECT user_id,date from online_users WHERE user_id = 1';
$result = executeQuery($sql);

// set our date/time value from MySQL into a variable
if ($line_online = mysql_fetch_assoc($result)){
    $time_stamp = $line_online['date'];
}

// format our date/time value TIMESTAMP any way we like now!
// MySQL result MUST be in this format '1262291376'
$date_format = date("m:d:y h:i:s A",$time_stamp); // formats timestamp in mm:dd:yy 
echo $date_format;


/////////////////////////////////////////////////////////
//   Add a time / date to MySQL                       //
////////////////////////////////////////////////////////

// this add a time and date to MySQL and looks like this in the MySQL table "2010-01-06 23:17:28"
// that is a TIMESTAMP field in MySQL, newer version of mysql store a timestamp like this "2010-01-06 23:17:28" instead of like this "1262819848"
$sql = "INSERT INTO users (`id`, `datetime`) VALUES ('', UTC_TIMESTAMP())";
executeQuery($sql);

// So if I query this record and try to show it like I do in the code above in the "Get mysql result section" It will not work correctly because  
// because it is like this "2010-01-06 23:17:28" instead of like this "1262819848"
// The ONLY solution I have found is to store the UTC timestamp into an INTEGER field instead of a DATETIME or TIMESTAMP field.
// Everyone on this site says this is wrong and I could use the default date and time stuff but I have yet to get it working.
// If I could store a timestamp in mysql like a timestamp with no "-" dashes in it, then it would work correctly when I show it on page.
// Basicly I have this half done, I can show the time and date in a users timezone as long as I pass the PHP a real TIMESTAMP like this "1262819848"

?>

Основываясь на прошлых ответах на аналогичный вопрос, а также на прочтении каждого поста на этом сайте, касающегося php / mysql и часовых поясов, я, вероятно, не решу эту проблему, поэтому начну вознаграждение за это, как только оно мне дадут. Спасибо

Ответы [ 3 ]

4 голосов
/ 09 января 2010

strtotime () в PHP - это способ передачи формата даты и времени базы данных в метку времени эпохи UNIX в PHP. Он читает понятные и стандартные форматы и преобразует метку времени эпохи UNIX, которая впоследствии может быть использована другими функциями datetime в php, такими как date ().

Альтернативы могут быть такими:

Функция UNIX_TIMESTAMP () в MySQL помогает вам конвертировать определенное значение даты-времени столбца или метки времени в метку времени UNIX. Как упоминалось в Datetime To Unix timestamp , это может быть немного быстрее, потому что это делается на стороне сервера MySQL.

Кажется, это скорее вопрос времени, чем вопрос часового пояса.

Подробнее:

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

http://www.php.net/strtotime

2 голосов
/ 09 января 2010

Прежде всего, если у вас есть решение проблемы программирования, вот мой совет: ИСПОЛЬЗУЙТЕ ЭТО. Не беспокойтесь о том, чтобы убедить галерею арахиса stackoverflow в правильности вашего решения.

Как было сказано, вот мои два бита:

Отображение пользователю даты в его часовом поясе является проблемой отображения / интерфейса. Ваши внутренние даты в коде и базе данных должны быть стандартизированы для общего часового пояса, а затем переведены в часовой пояс пользователя на дисплее.

Вместо установки date_default_timezone_set для пользовательского часового пояса установите часовой пояс сценария по умолчанию на UTC (чтобы он соответствовал значению времени / даты / времени MySQL), а затем примените смещение часового пояса пользователя к стандартизированной дате. Если пользователь указывает дату и время, например $mydate= 01/01/2010 5:30pm, примените к этой дате смещение tz пользователя и преобразуйте его в стандартизированное tz, используя strtotime, что-то вроде strtotime("$mydate $mytimezone"), где $ mytimezone - предоставленный пользователем часовой пояс или смещение.

0 голосов
/ 09 января 2010

если бы я мог передать "2010-01-06 23:17:28" в эту дату ("м: д: у ч: я: с А», $ time_stamp)

возможно с: date ('m: d: y h: i: s A', strtotime ('2010-01-06 23:17:28'))

...