【问题标题】:Modify a DateType variable修改 DateType 变量
【发布时间】:2018-07-31 10:15:18
【问题描述】:

我正在构建一个过滤器来按日期最小值和日期最大值选择元素。 表单生成器以 YYYY-MM-DD HH-MM-SS 格式向我返回日期,但 HH-MM-SS 始终等于 00-00-00。

但我希望我的最大日期为 YYYY-MM-DD 23-59-59。无论如何我可以修改我的最大日期?

提前致谢!

编辑

这是表单生成器代码

->add(
                'date_max',
                DateType::class,
                [
                    'label'         => 'Date max',
                    'attr' => ['style' => 'width: 1000px'],
                    'required'      => false,
                    'empty_data'    => null
                ]
            );

这是查询构建器代码

    if ($datemax !== null) {
        $qb->andWhere('q.date_creation >= :date_max')
            ->setParameter('date_max', $datemax);

我的问题是,我的表单生成器给了我一个日期类型,看起来像:

object(DateTime)#43691 (3) {  ["date"]=>  string(26) "2018-07-25 00:00:00.000000"["timezone_type"]=>  int(3)  ["timezone"]=>  string(3) "UTC"}

我希望它是这样的:

object(DateTime)#43691 (3) {  ["date"]=>  string(26) "2018-07-25 23:59:59.000000"["timezone_type"]=>  int(3)  ["timezone"]=>  string(3) "UTC"}

这样当我的 sql 查询执行时,我可以访问 date_max 的创建。

对不起,我的帖子有点乱(我的英语不太好)

【问题讨论】:

  • 您应该发布相关代码。没有这个,我唯一能建议的就是加一天减一秒。
  • 如果您对时间不感兴趣,为什么不直接使用日期?
  • 您的问题不清楚,因为您没有发布相关代码,但我假设您问的是如何创建和操作 DateTime 对象,对吧?如果是这种情况,您应该查看php.net/manual/en/class.datetime.php 并尝试应用 jeroen 的解决方案。
  • 改用\DateTimeImmutable。如果你真的不知道对象和引用是如何工作的,你最终会得到奇怪和意想不到的结果。
  • 请查看我的问题的编辑(编辑 2)。我认为这回答了您编辑的问题。如果没有,请提供更多信息以帮助回答问题。

标签: php symfony


【解决方案1】:

您可以使用 DateType 对象 ->format('Y-m-d') 来准确指定您想要的格式,然后将 23:59:59 连接起来。

这或多或少是你想要的吗?

此外,您可以在格式字符串中包含常量,如下所示:

$date = new DateTime('2018/01/01');

// Output year with constant time
echo $date->format('Y-m-d 23:59:59');

【讨论】:

  • 是的,这就是我想要的。但是如何连接 DateType 对象和字符串 23:59:59?
  • 当您将 DateType 对象与 ->format 函数一起使用时,输出是一个字符串。然后你可以连接 $date->format('Y-m-d') . ' 23:59:59' 。你应该有你想要的字符串。
【解决方案2】:

因为谁有时间阅读manuals

$date_string = "2018-07-31 00:00:00";
$date = new DateTime($date_string);
echo $date->format('Y-m-d H:i:s') . "\n";
// set the time to 1 second before midnight
$date->setTime(23, 59, 59);
echo $date->format('Y-m-d H:i:s') . "\n";

输出:

2018-07-31 00:00:00
2018-07-31 23:59:59

编辑

刚刚注意到您说时间格式是 HH-MM-SS。如果确实如此,您将需要此代码:

$date_string = "2018-07-31 00-00-00";
$date = DateTime::createFromFormat('Y-m-d H-i-s', $date_string);
echo $date->format('Y-m-d H-i-s') . "\n";
$date->setTime(23, 59, 59);
echo $date->format('Y-m-d H-i-s') . "\n";

输出:

2018-07-31 00-00-00
2018-07-31 23-59-59

编辑 2

鉴于您已经有一个 DateTime 对象,您所要做的就是设置时间:

var_dump($date);
// set the time to 1 second before midnight
$date->setTime(23, 59, 59);
var_dump($date);

输出:

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2018-07-31 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2018-07-31 23:59:59.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

【讨论】:

  • 好吧,说实话,如果每个人都读过手册,那么来 Stack Overflow 就没有什么意义了,不是吗? :)
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2011-04-09
相关资源
最近更新 更多