我想在Codeigniter 3中自动创建迁移文件。问题是当我生成带有时间戳的文件名时,我在下面的代码中使用了这样的date_default_timezone_set
,但它不起作用。我尝试在其他控制器中使用类似的结构,它们运行良好。我尝试过其他方法,例如在索引中设置时区.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;
}
}
}
问题是,您使用的 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.';
}
所以,总结一下,不要把这两个功能混在一起!
在页面顶部的配置/自动加载.php文件中加载时区。
date_default_timezone_set("美国/Los_Angeles"(;