无法在迁移CI3中设置时区

时间:2018-09-10 13:24:32

标签: php codeigniter timezone continuous-integration

我想在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;
    }
}

}

2 个答案:

答案 0 :(得分:0)

问题是,您使用的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.';
}

因此,总而言之,不要将这两个功能混合在一起!

答案 1 :(得分:0)

将时区加载到页面顶部的config / autoload.php文件中。

date_default_timezone_set('America / Los_Angeles');