Laravel/Lumen 中的自定义时区支持

Custom timezone support in Laravel/Lumen

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

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

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

  2. 在 Laravel 中全局支持此功能的最佳方式是什么,因为 $table->timestamps(); 使用 TIMESTAMP

  3. 当我查询数据库以将 json 输出到 [= 时,如何确保 date/times 自动转换为 Laravel 配置中指定的时区52=]?

注意:我不想翻译成多个时区,只是 .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();
    }

您可以使用 config\app.php 而不是 .env

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

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

Should I be storing timestamps in unix integer format?

你可以,但 iso8601 实际上是一个 ISO 标准,所以为什么不呢

What is the best way to support this globally in Laravel since $table->timestamps(); uses TIMESTAMP

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

How do I ensure date/times are automatically converted to the timezone specified in the Laravel config when I query the database to output json to an API?

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