【问题标题】:What is the best way to store Due Dates?存储截止日期的最佳方式是什么?
【发布时间】:2014-10-11 11:24:35
【问题描述】:

我有一个需要存储截止日期的应用程序。因此,如果英国的 Bob 创建了一个任务并说它在 2 月 20 日到期,我希望它在日历上显示为 2 月 20 日,而与其他用户的时区无关。

在 MySQL 中将其作为 UTC 存储为 DATETIME 会出现问题,如果 Bob 在 2 月 20 日凌晨 1 点创建任务,那么加利福尼亚的 Jane 将看到该任务在 2 月 19 日到期。

所以我的另一个想法是将其存储为DATE,但我找不到任何关于DATE 如何受时区影响的文献。

所以我的问题是,如果我的应用程序是 PHP 并且我的存储是 MYSQL,并且我想实现只存储日期而不是日期/时间的日历,并且我希望事件在全球范围内显示为某个日期,我应该怎么做是吗?

除了我的特殊需求之外,我还很好奇其他人如何实现特定于日期的事件(您是否只是让不同用户日历上的日期不同?) - 例如,Google 日历/Outlook 如何处理“全天”事件”?

【问题讨论】:

  • 澄清一下;你希望每个人,无论他们的时区,看到他们的任务是在他们自己的时区的 20 日到期,而不是在创建任务的人的时区?一个示例用法可能是填写一项调查,让简在半夜和 24 小时窗口中完成它是荒谬的,每个人都可以做这并不重要?
  • 是的,我希望每个人,无论他们的时区如何,都可以在他们的日历上看到 10 月 13 日星期一的某些事情。

标签: php mysql date datetime timezone-offset


【解决方案1】:

您可以将日期存储为 DATE 字段。由于您希望所有用户看到相同的日期,因此无需担心时区等。 IE。将2014-10-11 存储在列中,然后向用户显示该值。

【讨论】:

    【解决方案2】:

    最安全的方法是存储 unix 时间戳和作业创建者的时区。然后,在为其他用户显示日期时,使用该时区显示时间:

    $timestamp=1413027859;
    $timezone='Australia/Sydney';
    $dt=new DateTime();
    $dt->setTimestamp($timestamp);
    $dt->setTimezone(new DateTimeZone($timezone));
    $day=$dt->format('Y-m-d');
    

    【讨论】:

    • 所以你会在 MySQL 中使用两列来存储数据?一个 DATETIME/TIMESTAMP 和一个“用户的时区”VARCHAR(?)
    • 就我个人而言,我从不在数据库中使用DATETIME 类型,因为它们似乎从来没有像我期望的那样工作,并且(有时微妙地)对于每种 SQL 风格都不同。所以,如果时区不相关,我只存储 unix 时间戳(例如,某个事件发生的时间)。如果时区相关,我将其存储在时间戳旁边的单独字段中,或间接存储,例如。通过拥有一个 Person 表的外键,该表存储该人的时区。
    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 2016-12-22
    • 2011-08-28
    • 2017-09-18
    • 1970-01-01
    • 2017-12-20
    • 2011-05-07
    • 2012-10-03
    相关资源
    最近更新 更多