Не удается установить часовой пояс в миграции CI3

Я хочу автоматически создать файл миграции в Codeigniter 3. Проблема в том, что когда я генерирую имя файла с отметкой времени, я использую date_default_timezone_set, как этот код ниже, но он не работает. Я пробовал использовать аналогичную конструкцию в других контроллерах, и они работают очень хорошо. Я пробовал другие способы, такие как установка часового пояса в index.php или файле конфигурации, но они тоже не работали. Что мне не хватает?

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Migrate extends CI_Controller {

function __construct()
{
    parent::__construct();
    date_default_timezone_set('Asia/Ho_Chi_Minh');

    if ( !$this->input->is_cli_request() ) {
        show_error('You don\'t have permission for this action', 403);
        return;
    }
    $this->load->library('migration');
}

public function generate($name = false)
{
    if ($name === false) {
        echo 'Please define migration name' . PHP_EOL;
        return;
    }
    if ( !preg_match('/^[a-z_]+$/i', $name) ) {
        echo 'File name must contain only a-z characters' . PHP_EOL;
        return;
    }

    var_dump(ini_get('date.timezone')); // see set timezone here
    $fileName = sprintf('%d_%s.php', date('YmdHis'), $name);
    try {
        $folderPath = APPPATH . 'migrations/';
        if ( !is_dir($folderPath) ) {
            try {
                mkdir($folderPath);
            } catch (Exception $e) {
                echo 'Error on create folder: ' . $e->getMessage() . PHP_EOL;
            }
        }

        $filePath = $folderPath . $fileName;
        if (file_exists($filePath)) {
            echo 'File already exists' . PHP_EOL;
            return;
        }

        $data['className'] = $name;
        $data = '<?php ' . $this->load->view('migrations/migration-template', $data, true);

        try {
            if (file_put_contents($filePath, $data) !== false)
                echo 'Migration file was created successfully' . PHP_EOL;
        } catch (Exception $e) {
            echo $e->getMessage() . PHP_EOL;
        }
    } catch (Exception $e) {
        echo $e->getMessage() . PHP_EOL;
    }
}

}

"но это не работает". Это бесполезно. Какой ввод? Какой ожидаемый результат? Какой реальный выход? Какие есть ошибки или уведомления error_log?

delboy1978uk 10.09.2018 15:26

Извините за нечеткое описание. Я использовал var_dump(ini_get('date.timezone')); // see set timezone here, чтобы узнать, какой часовой пояс установлен: «Европа / Берлин», а не Asia / Ho_Chi_Minh, как я ожидал.

Kien Pham 10.09.2018 15:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в том, что используемая вами команда set работает только для этого сценария и не изменяет ini. Итак, получив значение ini, у вас теперь есть несовпадающие часовые пояса.

Вместо этого используйте date_default_timezone_get()

http://be2.php.net/manual/en/function.date-default-timezone-get.php

Или используйте как ini_set(), так и ini_get().

Код ниже взят из установленной страницы руководства http://be2.php.net/manual/en/function.date-default-timezone-set.php:

<?php
date_default_timezone_set('America/Los_Angeles');

$script_tz = date_default_timezone_get();

if (strcmp($script_tz, ini_get('date.timezone'))){
    echo 'Script timezone differs from ini-set timezone.';
} else {
    echo 'Script timezone and ini-set timezone match.';
}

Итак, чтобы подвести итог, не смешивайте две функции вместе!

Спасибо! Я использую date_default_timezone_get и он работает

Kien Pham 10.09.2018 16:27

Рад, что смог помочь, можете ли вы отметить это как правильный ответ?

delboy1978uk 10.09.2018 16:28

Да, я сделал это. ;)

Kien Pham 10.09.2018 16:36

Загрузите часовой пояс в файл config / autoload.php вверху страницы.

date_default_timezone_set ('Америка / Лос-Анджелес');

Другие вопросы по теме