【问题标题】:How can I account for user time-zone while displaying timestamps from a mySQL database?如何在显示来自 mySQL 数据库的时间戳时考虑用户时区?
【发布时间】:2019-10-16 08:56:43
【问题描述】:

我有一个聊天程序,当用户发送聊天时,会在 mySQL 中创建一个自动时间戳。显示聊天记录时,我需要根据每个用户所在的时区调整所有时间戳...

即。

加利福尼亚有人看到:

Bob: Hi (May 30 2019 10:00 AM)
Rob: Bye (May 30 2019 10:01 AM)

芝加哥有人看到:

Bob: Hi (May 30 2019 12:00 AM)
Rob: Bye (May 30 2019 12:01 AM)

意味着我不能将时间戳存储在考虑时区的数据库中,否则所有用户都会看到如下内容:

(假设 bob 在加利福尼亚,Rob 在芝加哥,并且消息发送间隔 1 分钟)

Bob: Hi (May 30 2019 10:00 AM)
Rob: Bye (May 30 2019 12:01 AM)

所以当我提取日期/时间时,这是我使用的 php 代码:

if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
    echo "<label style = 'font-size:1.1vw';>".date('M j Y g:i A', strtotime($row['time']))."</label>"."<br>";
}

} else {

}
$conn->close();

PHP 解决方案对我来说是最理想的,但我也愿意实施 javascript 或 jQuery 解决方案。

(PS - 我不知道 mySQL 存储的是哪个时区,但它不是我当前的时区......所以脱离我当前时区的时间偏移解决方案需要某种解决方法)。

【问题讨论】:

标签: php mysql timezone


【解决方案1】:

可能的解决方案here

在 JavaScript 中你会做这样的事情:

var dateToConvert = new Date(<?= json_encode($row['time']) ?>);
console.log('full date is ', dateToConvert.toLocaleString());
console.log('just the date is ', dateToConvert.toLocaleDateString());
console.log('just the time is ', dateToConvert.toLocaleTimeString());

【讨论】:

  • 您的日期未加引号并且结束标记错误。试试&lt;?= json_encode($row['time']) ?&gt;
【解决方案2】:

大概每个用户都有一个存储在某处的首选时区?然后使用该值在数据库级别进行调整是一件简单的事情。您没有提供任何示例代码,但假设您有一个将 America/Los Angeles 存储为首选时区的用户对象,您可以执行以下操作:

SELECT message_body, CONVERT_TZ(message_time, 'SYSTEM', ?) AS message_time FROM messages;

并将当前用户的时区作为参数从 PHP 传入

【讨论】:

  • 嗯,通常使用 SQL 查询为请求它们的客户端提取消息。您有什么样的架构,您可以执行单个数据库查询并将相同的结果返回给每个用户?
  • 这就像公共聊天之类的东西。有一个表存储用户配置文件,另一个表存储消息(列:用户、消息、时间)。当用户发送聊天时,他们的用户名被记录/存储,他们的消息被记录/存储/显示,并且时间戳由 mySQL 自动时间戳创建......然后整个“消息”日志也会显示并自动更新看。我也在进行一对一的聊天,但我会先弄清楚这一点。签出:glass.hol.es
  • 是的,我想为不同的用户显示不同的东西,但我不能将它们存储在考虑到他们自己的时区的数据库中(没有问题)。
  • 但用户仍在请求“消息日志”,除非您将其写入静态文件。
  • 嗯,它是由每半秒左右触发一次的 jQuery 请求完成的。 jQuery 所做的只是刷新/显示消息表的内容。所以你建议我做的是当我提取日期/时间时,我应该立即转换它。好的,是的,这会起作用,哈哈,我想我只是误解了你。我会尝试一下。我只是不知道你的意思是“但假设你有一个存储美国/洛杉矶的用户对象......”我直接从 mySQL 创建自动生成的时间戳,我不知道它存储在哪个时区下不幸的是......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2011-05-17
相关资源
最近更新 更多