如何获取尊重用户时区的日期和时间

时间:2017-04-07 09:30:14

标签: php mysql datetime

我对php / mysql日期/时间函数感到困惑 我的date列为timestamp - defalult值 - current_timestamp

date_default_timezone_set("Europe/Belgrade"); //my timezone

$stmt = $db->query("SELECT * FROM cinema order by date desc");
while($row = $stmt->fetch()){
    $date = strtotime($row['date']);
    $datea = date("d-m-y", $date);
    $time = date("H:i", $date);
    ...

与当地时间相比,我的差距为-2小时。

如何才能获得正确的时间(尊重我的时区),并且如果可能的话,每个用户(无论他位于地球上)是否都能获得关于他自己时区的数据?

3 个答案:

答案 0 :(得分:2)

MySQL根本不保存时区。根据您使用存储数据的内容,您应始终将日期时间值存储在" UTC" (这就像GMT一样,完全没有TZ偏移)或者在某些情况下你想用已经设置的偏移来存储它。但是对于第二个选项,您还应该将TZ或偏移量存储在其他地方(同样,MySQL日期时间无法存储),以便从数据库中正确地重建对象。

例如,我通常在我的db记录中添加created_at,updated_at字段并将其存储在UTC中,对于此任务,我使用PHP's gmdate('Y-m-d H:i:s')

现在,如果你必须在用户的TZ中显示这个日期时间,你只需创建一个这样的DateTime对象并更改TZ:

$createdAt = new DateTimeImmutable(
    $row->created_at, 
    new DateTimeZone('UTC')
);

对于第二种情况,您可以使用额外的数据存储日期时间,同时保存TZ,您必须确保使用timezone constructor second argument实例化DateTime对象以正确移动偏移量。因此,对于将前往马德里的阿根廷人来说,您可能希望将登记日期存储在目的地的TZ(例如马德里),但是出于显示目的,(例如想知道是否可以在正常时间呼叫)让家人知道他/她到了Ok)你后来将它转换为原点tz:

$checkinAt = new DateTimeImmutable(
    $row->checkin_at,
    new DateTimeZone('Europe/Madrid')
);
$checkinAt->setTimezone('America/Argentina/Buenos_Aires');

总结一下:

  • 您需要知道日期是如何存储的,如果以UTC格式存储所有日期(例如没有偏移量)则更简单,但如果您需要访问数据(如果已经有偏移量),则可能在查询数据时遇到问题。
  • MySQL不会将TZ及其日期时间值存储起来。
  • 确保使用适当的时区实例化DateTime对象,如果您没有在构造函数中传递任何时区,PHP将使用默认的TZ。这是set on the php.ini,您可以在脚本中使用此function date_default_timezone_set进行更改。

答案 1 :(得分:1)

你可以在sql查询中非常甜蜜地完成它

  

CONVERT_TZ(dt,from_tz,to_tz)

     

http://www.w3resource.com/mysql/date-and-time-functions/mysql-convert_tz-function.php

$stmt = $db->query("SELECT *, CONVERT_TZ(date, "+00:00", "+01:00") FROM cinema order by date desc");

^假设您的数据库是UTC时间,您尝试转换的时间是" Europe / Belgrade"。

第一个参数是您的日期时间戳,第二个是您的数据库时区,第三个是您希望它转换为的时间。如果时区更改是针对查询的where / conditional部分,那么您可以将其放置在相反的位置。

答案 2 :(得分:-1)

获取用户或浏览器时间。您必须拥有自己的时区,可以从Link获得。

请按以下步骤操作:

  1. 下载代码并通过函数调用
  2. 调用它
  3. 在第一个输出中,您将看到浏览器/用户日期时间,您需要使用js bulit-in函数相应地更改(例如:mm-dd-YY)。
  4. 将输出的值放入一个js变量中,并传递该值以形成隐藏的输入字段
  5. 表单提交后,将该值作为GET / POST捕获到您的数据库。
  6. 如果您仍然很难过,请告诉我。