【问题标题】:Set end of day instead of 00:00:00 in laravel在 laravel 中设置一天结束而不是 00:00:00
【发布时间】:2019-01-08 06:20:09
【问题描述】:

当我们传递像这样的日期值2019-01-01 而没有时间10:00:00 时,时间默认为00:00:00。所以最终 db 兼容值被转换为:2019-01-01 00:00:00。如何强制将其默认为 23:59:00

示例:我需要设置一个expiry_date 属性,但如果我只从用户那里获取日期输入2019-01-08,用户会假设他们将一整天作为到期日,而实际上它由于隐式默认时间00:00:00,将在2019-01-08 的第一秒过期。

我该如何克服这个问题?如何为expiry_date 设置一个mutator,将这个2019-01-01 00:00:00 变成这个2019-01-01 23:59:00

【问题讨论】:

  • 只比较日期部分可能更简单,例如类似DATE(expiry_date) > CURDATE()

标签: php laravel datetime php-carbon


【解决方案1】:

只需使用以下内容:

$expiryDate = Carbon::createFromFormat('Y-m-d', $date)->endOfDay()->toDateTimeString();

这将获取日期(如果需要,更新日期格式),切换到一天结束并将结果对象转换为日期时间字符串。

或者,将其用作属性设置器:

/**
 * @param $value
 */
public function setExpiryDateAttribute($value)
{
    $this->attributes['expiry_date'] = Carbon::createFromFormat('Y-m-d', $value)
        ->endOfDay()
        ->toDateTimeString();
}

【讨论】:

    【解决方案2】:

    您可以使用类似 strtotime() 函数的东西向当前时间戳添加内容。 $expiry_date = date("Y-m-d H:i:s", strtotime('+5 hours')).

    如果您需要在函数中使用变量,则必须使用双引号,然后像 strtotime("+{$hours} hours"),但最好使用 strtotime(sprintf("+%d hours", $hours))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 2013-07-23
      • 1970-01-01
      相关资源
      最近更新 更多