无法在迁移CI3中设置时区

问题描述 投票:0回答:2

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

}

php codeigniter timezone continuous-integration
2个回答
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.';
}

总而言之,不要将两种功能混合在一起!


0
投票

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

date_default_timezone_set( '美洲/洛杉矶');

© www.soinside.com 2019 - 2024. All rights reserved.