DateTime php возвращает неправильную дату - PullRequest
0 голосов
/ 05 ноября 2018

Я использую класс PHP DateTime для создания даты для пользовательской системы лицензирования. Пока я отлаживал его, я заметил, что время даты всегда неверно, оно будет 5-dec-2018, но сейчас мы находимся в ноябре, и эта дата будет такой же и для 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 голосов
/ 05 ноября 2018

Это ожидаемое поведение, так как вы 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);

См. живое демо .

...