Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để cập nhật múi giờ cho các dấu thời gian (create_at và updated_at) do Laravel Eloquent quản lý?

Tôi biết câu hỏi này hơi lỗi thời, nhưng tôi đã vấp phải nó khi cố gắng đưa ra cùng một giải pháp và muốn chia sẻ cách tôi đã giải quyết nó.

Lời khuyên của tôi là không nên thay đổi múi giờ mà các thư được lưu trữ. Hãy lưu trữ chúng trong cơ sở dữ liệu dưới dạng UTC. Giữ cho bộ nhớ của bạn được đặt thành một hệ quy chiếu không đổi và sau đó chuyển đổi nó sang bất kỳ múi giờ nào bạn cần để nó được hiển thị sẽ giúp bạn đỡ phải đau đầu về lâu dài.

Ví dụ về một trong những vấn đề đau đầu đó, hãy tưởng tượng hai người đang cố gắng điều phối thời gian họp ở các múi giờ khác nhau, trong đó một người quan sát DST và một người thì không và bạn cần hiển thị thời gian theo giờ địa phương của mỗi người dùng. Thật khó để chuyển đổi thời gian PDT được lưu trữ của bạn để nói rằng, Mỹ / Cayman (không tuân theo DST)? Và làm thế nào bạn sẽ tính đến thời gian được lưu trữ trong PST so với PDT? Làm sao bạn biết? (Gợi ý:nếu không có hàng trăm dòng mã bổ sung chỉ để trả lời một câu hỏi đó, bạn sẽ không ).

Để hết thời gian ở múi giờ chính xác, chỉ cần thêm một hàm đột biến trên chính mô hình:

use Carbon\Carbon;

class MyModel extends Eloquent
{
    public function getCreatedAtAttribute($value)
    {
        return Carbon::createFromTimestamp(strtotime($value))
            ->timezone('America/Los_Angeles')
            ->toDateTimeString()
        ;
    }
}

Bây giờ, bất cứ khi nào bạn thực hiện $myModel->created_at nó sẽ được chuyển đổi một cách kỳ diệu thành múi giờ chính xác, nhưng bạn vẫn giữ UTC trong cơ sở dữ liệu của mình, điều này chắc chắn có các đặc quyền của nó so với các múi giờ khác để lưu trữ liên tục.

Bạn muốn cho phép người dùng đặt múi giờ của riêng họ? Thay đổi chức năng này:

public function getCreatedAtAttribute($value)
{
    $user = Auth::user();
    // If no user is logged in, we'll just default to the 
    // application's timezone
    $timezone = $user ? $user->timezone : Config::get('app.timezone');

    return Carbon::createFromTimestamp(strtotime($value))
        ->timezone($timezone)
        // Leave this part off if you want to keep the property as 
        // a Carbon object rather than always just returning a string
        ->toDateTimeString()
    ;
}

Và tất cả sự phức tạp của việc thay đổi múi giờ, có tính đến việc tiết kiệm ánh sáng ban ngày hay không đều không thể tránh khỏi bạn và bạn có thể quên rằng điều đó thậm chí phải xảy ra.

Để biết thêm thông tin về trình đột biến / trình truy cập Laravel, hãy xem tài liệu .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng Python và MySQL trong Quy trình ETL:SQLAlchemy

  2. Làm cách nào để chèn nhiều hàng dựa trên một truy vấn?

  3. Tính khả dụng cao với ngân sách hạn hẹp - Triển khai Cụm MySQL Galera tối thiểu hai nút

  4. Truy vấn trong kinh độ và vĩ độ trong MySQL

  5. hiển thị dữ liệu từ cơ sở dữ liệu vào bảng html