【问题标题】:Symfony Doctrine query entries by datetime and timezoneSymfony Doctrine 按日期时间和时区查询条目
【发布时间】:2013-08-09 09:54:43
【问题描述】:

我有一个用 Symfony 编写的网络服务。应用程序调用它并输入必须在特定时间发送到应用程序的消息。服务器上的 cronjob 每分钟运行一次并检查必须发送哪些消息。但是用户可以定义他想接收这些消息的时间范围。

我通过以下方式查询这些消息:

$query = $em->createQuery('
    SELECT m
    FROM MyBundle:Message m
    INNER JOIN m.user u
    WHERE m.active = true
        AND m.nextMessageOn <= :now
        AND u.receiveMessagesFrom <= :now
        AND u.receiveMessagesTo >= :now
    ORDER BY m.id ASC
')->setParameter('now', new \DateTime('now'));

(出于演示目的,“开始时间”必须在“结束时间”之前)

现在我遇到了问题,用户可以使用与服务器不同的时区。

是否有某种最佳实践来处理空洞时间(日期时间)/时区/服务器/应用程序问题?特别是对于 Symfony (Doctrine) 是否有一种干净的方式来查询这些项目?

【问题讨论】:

    标签: mysql datetime symfony doctrine timezone


    【解决方案1】:

    您应该在数据库中为用户保存正确的时区并阅读以下内容:http://docs.doctrine-project.org/en/latest/cookbook/working-with-datetime.html

    【讨论】:

    • 好的,我希望我可以用日期保存时区,但这种方法也很好。我没有得到什么:如何使用/集成自定义 DateTimeType?
    • 好的,你需要像这里提到的那样将类型添加到 config.yml:stackoverflow.com/questions/10955563/… 不幸的是有两个问题。由于我不想在平台时区中使用它,而是在单个用户时区中使用它,所以无论如何我都需要为显示添加一个转换器。我使用 type="datetime" 和 "@ORM\Version" 的列“updatedOn”。更新实体时,它将为我节省当前时间。不幸的是,这仍然保存在平台时区中。所以这有点令人困惑。
    • 当实体第一次刷新到数据库时,也会触发时区转换。构建一个转换器类并在日期时间属性的 setter 和 getter 中调用它的方法可能会更好。
    • 没错,刷新实体就设置了时区。如果您的数据库中已有数据,则必须手动更正此问题。 Symfony2 是 MVC,所以不要在模型级别转换您的时区,在您的控制器中执行此操作。这是一个示例,如果用户登录,您如何从数据库中获取时区:stackoverflow.com/questions/10694315/…。有关时区和 symfony2 的更多信息:matt.drollette.com/2012/07/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多