我想在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;
}
}
}
答案 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');