【问题标题】:cannot set timezone in migrate CI3无法在迁移 CI3 中设置时区
【发布时间】:2018-09-10 13:24:32
【问题描述】:

我想在 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警告错误或通知?
  • 抱歉描述不清晰。我使用var_dump(ini_get('date.timezone')); // see set timezone here 来查看设置的时区是什么:'Europe/Berlin',这不是我所期望的 Asia/Ho_Chi_Minh。

标签: php codeigniter timezone continuous-integration


【解决方案1】:

问题是,您使用的 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,它可以工作
  • 很高兴我能帮上忙,你能把这个标记为正确答案吗?
  • 是的,我做到了。 ;)
【解决方案2】:

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

date_default_timezone_set('America/Los_Angeles');

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多