【问题标题】:Symfony time input and timezoneSymfony 时间输入和时区
【发布时间】:2017-07-06 18:57:50
【问题描述】:

我有一个具有 time 属性的实体。 在表单中,我有一个 TimeType。 我在表格中写的时间正是存储在 DB ex 中的时间。 14:54。但是当我从我的数据库中取回它时,我得到了 13:54。 我想这是一个时区问题,但我不知道如何处理这个问题。 我尝试设置model_timezoneview_timezone,但似乎没有任何改变。 我的问题是没有 startTime 属性

编辑:这里有一些代码

实体

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

/**
 * BookingSession
 *
 * @ORM\Table(name="booking_session")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\BookingSessionRepository")
 */
class BookingSession
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @Groups({"base"})
     */
    private $id;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="date", type="datetimetz")
 * @Groups({"base"})
 */
private $date;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="startTime", type="time")
 * @Groups({"base"})
 */
private $startTime;
//...

表格

$builder
    ->add('startTime', 'time',['widget' => 'single_text','hours'=>$hours,"label"=>false,"attr"=>['class'=>'hidden']])

【问题讨论】:

  • 你能给我们看一些代码,让我们知道我们在处理什么吗?

标签: php time symfony


【解决方案1】:

问题是“时间”属性是什么意思。如果您将日期保存为 DateTime 我更喜欢什么,那么您将返回一个 DateTime 对象,您可以使用。

/**
 * @ORM\Column(type="datetime", nullable=true)
 */
private $mydate;

要配置时区,您应该查看服务器,如果时区和日期设置正确,您可以在 php.ini 文件中设置时区。

https://secure.php.net/manual/en/datetime.configuration.php

还有一篇文章可以帮助您解决一些问题。

Symfony2 and date_default_timezone_get() - It is not safe to rely on the system's timezone settings

【讨论】:

  • 我想念的是为什么它会存储我在表单中写入的确切时间值,而当我从存储库中取回实体时,我会修改值。
  • 如果您在实体中使用“datetime”而不是“datetimetz”作为类型会怎样?
  • 我得到了完全相同的结果。我写了 12:14,它存储了 12:14,$startTime->format('H:i') 写了 11:14
  • 那么您系统中的任何地方的日期时间都不正确。试着聊聊你的系统和你的 php 安装。创建phpinfo 并检查设置的时区。
  • PHP 和 mysql 设置为“欧洲/柏林”。
【解决方案2】:

这是因为与TimeType 字段相关的Datetime 对象是使用默认日期1970-01-01 构建的。

将时间转换为用户时区时,Datetime 对象将使用 1970 年 1 月 1 日的夏令时计算。

在此日期,某些时区在应用程序中没有夏令时,无法返回预期时间。

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2021-11-17
    • 2014-02-22
    • 1970-01-01
    相关资源
    最近更新 更多