【问题标题】:MySQL & PHP - How to convert date, time, and timezone when stored separatelyMySQL & PHP - 如何在单独存储时转换日期、时间和时区
【发布时间】:2016-03-05 17:30:07
【问题描述】:

在我们的应用程序中,我们目前分别存储日期、时间和时区。日期字段是可选的,这就是我们将所有内容分开的原因。对于用户界面,他们将专门选择日期、时间和时区。当前所有内容都以 UTC 格式存储,时区将是一个 ID,它引用另一个查找表。

按照我的理解和看法,我们可以显示用户指定的日期和时间,只需显示所有这三个值,而无需进行任何调整。如果他们在太平洋标准时间 11-30-15 下午 6:00 输入,这就是他们将看到的,以我们认为合适的格式进行。

  • 到目前为止,是否有任何人可以想到这样做的直接问题?
  • 我应该如何处理时间转换?在系统中的某个时刻,它需要了解实际时间。系统时间是 UTC,但如果需要在太平洋标准时间上午 11:00 执行某些工作,那么它需要知道这一点。我想知道将时间存储为 UTC 是否存在问题,但让他们指定一个不同的时区。例如,时间应该是 PST,但存储为 UTC。

我将 Laravel 与 Carbon 一起使用,只是为了提供更多信息。任何反馈都会很棒!

【问题讨论】:

  • 我认为你最好存储时间戳 + 用户时区,而不是在检索日期时使用 carbon 将其转换为用户本地时间

标签: php mysql datetime laravel-5.1 php-carbon


【解决方案1】:

将整个日期、时间和时区存储为单个列。将用户输入的时间转换为 GMT 并存储在数据库中。当您需要向用户显示时间时,请将 GMT 转换为 USERTIMEZONE。

function getGeneralTimeFormat()
{
    return 'Y-m-d H:i:s';
}
function convertDateTimeToGMT($dtime)
{
    date_default_timezone_set('GMT');
    $dtzone = new DateTimeZone(getTimeZoneDateTime($_SESSION['USER_TIMEZONE']));
    $dtime->setTimeZone($dtzone);

    return $dtime->format(getGeneralTimeFormat());
}
function convertGMTToLocalTime($timestamp)
{
    date_default_timezone_set('GMT');
    $dtime = new DateTime($timestamp);
    $dtzone = new DateTimeZone(getTimeZoneDateTime($_SESSION['USER_TIMEZONE']));
    $dtime->setTimeZone($dtzone);

    return $dtime->format(getGeneralTimeFormat());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2012-03-10
    • 2019-12-04
    • 1970-01-01
    • 2012-07-18
    • 2020-11-20
    相关资源
    最近更新 更多