В настоящее время я программирую групповой чат для небольшого проекта на PHP. Во время программирования я столкнулся с большим вопросом: как мне обращаться с датой и временем?
Чат спроектирован таким образом, что теоретически бесконечное количество людей могут писать друг с другом в чате.
Теперь, когда кто-то пишет новое сообщение, я, естественно, хочу отобразить текущую дату и время пользователя в сообщении, чтобы пользователь впоследствии знал, когда он написал, какое сообщение. Я решил эту проблему, вызвав функцию в JavaScript при добавлении сообщения, которое добавляет сообщение в чат, а затем сохраняет его в базе данных через AJAX.
Чтобы установить время в новом сообщении, я действовал следующим образом:
let messageWrapper = $( "#message-wrapper" ),
newMessage = $( "#template" ).clone(),
newMessageDate = new Date();
newMessage.find( ".time" ).text( newMessageDate.getHours() + ":" + +( newMessageDate.getMinutes() < 10 ? "0" : "" ) + newMessageDate.getMinutes() );
messageWrapper.append( newMessage );
После добавления сообщения я теперь записываю его в свою базу данных. Для этого я использую AJAX:
let data = {
action: "create_message",
created: newMessageDate.getTime()
};
$.post( ajax_url, data, function () {
} ).success( function () {
console.log( "Message successfully saved in DB" );
} );
Как видите, я использую здесь функцию getTime()
, которая дает мне метку времени даты.
В PHP я теперь получаю метку времени и меняю ее на формат метки времени своей базы данных, чтобы я мог правильно сохранить ее в базе данных:
$created = $_POST['created'];
$formatted_created = date( 'Y-m-d H:i:s', $created / 1000 );
Но здесь я заметил, что метка времени в формате UT C и не соответствует времени в новом сообщении. Я думал, что это не будет проблемой, и я просто должен уважать часовой пояс при его отображении, но это не так просто.
Если предположить, что человек А приехал из Америки и пишет в чате, то его время показано, и я получаю метку времени в формате UT C. На другом конце света человек B сидит и имеет другой часовой пояс. Там браузер использует местное время и отметка времени UT C.
Однако теперь у меня проблема в том, что я не знаю, как отобразить сообщение пользователю в правильном формате, в зависимости от часового пояса пользователя.
Конечно PHP предложения возможность установить часовой пояс, но тогда это будет только определенный часовой пояс, который в моем случае бесполезен:
date_default_timezone_set('America/Los_Angeles');
echo date( 'Y-m-d H:i:s', strtotime( $message->created ) );
Мой вопрос, как мне поступить в этом случае? Как мне определить дату и время для нового сообщения?
PS: я знаю, что это много теории, и не всем разработчикам это нравится. Тем не менее, я очень старался описать проблему как можно лучше. Если чего-то не хватает для разъяснения, я с радостью добавлю это.