PHP的DateTime返回错误的日期

时间:2018-11-05 17:07:09

标签: php datetime licensing

我正在使用PHP DateTime类为自定义许可系统生成日期。在调试时,我注意到日期时间总是错误的,它将是5-dec-2018,但现在是11月,并且expiration_date的日期也将是相同的。

我如何解决此问题?我需要在试用期开始日期前增加30天。

这是代码。

class Activator {

  private $uuid;
  private $keygen;
  private $licence_code;

  public static function generateLicence($uuid) {

    if (!file_exists(ABSPATH.'/DataStorage/.licence')) {
        $start_date = new DateTime();
        $time_zone = $start_date->setTimezone(new DateTimeZone('Europe/Rome'));
        $trial_date = $start_date->add(new DateInterval('P30D'));
        $end_date = $trial_date->format('d-M-Y');
        $machine_uuid = bin2hex($uuid);
        $licence_code = base64_encode($machine_uuid);

        $licence_file = array(
          'uuid' => $machine_uuid,
          'activation_date' => $time_zone->format('d-M-Y'),
          #'trial_version' => true,
          #'expire_date' => $end_date,
          #'licence_code' => $licence_code
        );

        $w = file_put_contents(ABSPATH.'/DataStorage/.licence', json_encode($licence_file));
        echo $w;
    }
}

1 个答案:

答案 0 :(得分:1)

这是您预期的行为,因为您add()到目前为止(通过执行$start_date->add(...)-这会修改原始对象$start_date

您可以用几种不同的方法解决此问题,尽管最简单的方法就是完全在结构中直接添加30天来创建一个新实例。您还可以将时区设置为new DateTime()的第二个参数。

$timezone    = new DateTimeZone('Europe/Rome');
$start_date  = new DateTime("now", $timezone);
$trial_date  = new DateTime("+30 days", $timezone);

请参阅此live demo