【问题标题】:Custom timezone support in Laravel/LumenLaravel/Lumen 中的自定义时区支持
【发布时间】:2017-06-26 16:44:52
【问题描述】:

如果我正在构建一个时区感知 Laravel (Lumen) 应用程序,用户可能无法控制他们的数据库时区设置,但可以在配置中为我的应用程序提供自定义时区。

我还需要能够通过第三方应用程序中的直接连接将时间戳存储在数据库中(再次记住数据库配置中的时区可能不正确)所以我认为 unix 时间戳是合适的,所以我可以在我的第三方直连中使用UNIX_TIMESTAMP(NOW())

  1. 我应该以 unix 整数格式存储时间戳吗?

  2. 自从$table->timestamps(); 使用 TIMESTAMP 以来,在 Laravel 中全球支持这一点的最佳方式是什么

  3. 当我查询数据库以将 json 输出到 API 时,如何确保日期/时间自动转换为 Laravel 配置中指定的时区?

注意:我不想翻译成多个时区,只是 .env 中的一个

当前.env

APP_TIMEZONE=UTC

当前迁移示例

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateSharesTable extends Migration
{
    public function up()
    {
        Schema::create('shares', function (Blueprint $table) {
            $table->increments('id');

            $table->string('url', 500);
            $table->string('description', 100);
            $table->integer('hits');
            $table->string('ip_address', 39);

            $table->timestamps();
        });
    }

当前共享模型

namespace App;

use Illuminate\Database\Eloquent\Model;


class Share extends Model
{

    protected $fillable = ['url', 'description', 'ip_address'];

    protected $hidden = ['ip_address'];
}

当前控制器示例

namespace App\Http\Controllers;

use App\Share;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class ShareController extends Controller
{

    /**
     * @SWG\Get(
     *     tags={"Shares"},
     *     path="/shares",
     *     summary="Finds all shares",
     *     description="Returns all shares ",
     *     @SWG\Response(
     *         response=200,
     *         description="A list of all shares"
     *     )
     * )
     */
    public function fetchAll()
    {

        return Share::get();
    }

【问题讨论】:

    标签: mysql laravel lumen laravel-5.4


    【解决方案1】:

    您可以使用config\app.php 代替.env

    config(['app.timezone' => $timezone]);
    

    $timezone 是其中之一:http://php.net/manual/en/timezones.php

    我应该以 unix 整数格式存储时间戳吗?

    你可以,但是 iso8601 几乎是一个 ISO 标准,所以为什么不这样

    在 Laravel 全球支持这一点的最佳方式是什么? $table->timestamps();使用时间戳

    Carbon 是处理时间戳、加减时间的好方法。使用我上面的代码更改时区并在 Carbon 中使用它们。

    如何确保日期/时间自动转换为时区 当我查询数据库以输出时在 Laravel 配置中指定 json 到 API?

    如果您在会话中设置可以在请求之间保留的时区,或者如果您在每个请求中将它作为参数传递 alang,这就是 Laravel 将为您处理的事情。

    【讨论】:

    • 如果我要从我的第三方直接数据库连接中使用 NOW(),但是这将根据数据库的时区设置插入一个 TIMESTAMP。因此,我不应该将所有内容存储在 unix 时间戳中以确保第三方直接连接和 Laravel 将它们插入相同的“时区”(UTC)。
    • 我会将所有内容存储为 UTC en.wikipedia.org/wiki/ISO_8601#Time_offsets_from_UTC 并且它们会根据访问者时区动态显示时间戳从浏览器获取信息 (stackoverflow.com/questions/1091372/…)
    • 刚刚意识到我可以使用来自第三方直接连接的UTC_TIMESTAMP()
    • Lumen的config目录下没有app.php文件(config\app.php),那么我们将如何解决这个问题呢?提前致谢。
    猜你喜欢
    • 2016-03-12
    • 2018-09-10
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2015-12-29
    • 2016-05-14
    相关资源
    最近更新 更多