Dấu thời gian mặc định của Laravel được lưu trữ trong UTC và nếu bạn làm việc với một ứng dụng mà người dùng ở múi giờ khác, họ có thể thấy dấu thời gian trong ứng dụng không khớp với múi giờ của họ
Để khắc phục điều này, bạn cần lưu trữ múi giờ của người dùng trong cơ sở dữ liệu và đồng thời chuyển đổi các mô hình liên quan đến người dùng thành múi giờ thích hợp từ UTC
Chúng tôi sẽ bao gồm hướng dẫn này trong hai phần
- Truy xuất và lưu trữ múi giờ của người dùng
- Chuyển đổi dấu thời gian UTC thành TimeZone của người dùng
Hãy bắt đầu với phần đầu tiên
#1 Truy xuất và lưu trữ múi giờ của người dùng
Chúng tôi sẽ sử dụng plugin javascript trong nền để lấy múi giờ của người dùng và chúng tôi có thể lưu trữ múi giờ trong bảng của người dùng tại thời điểm Đăng ký hoặc Đăng nhập. Chúng tôi sẽ bao gồm cả hai cách
Để lưu trữ múi giờ của người dùng trong cơ sở dữ liệu, chúng tôi sẽ cần thêm một cột trong bảng của người dùng, trước tiên hãy thêm cột đó
Thêm cột "múi giờ" trong cơ sở dữ liệu bảng người dùngChúng tôi phải thêm một cột mới "múi giờ" trong bảng người dùng. cho điều này thêm một lĩnh vực mới trong
Tệp
php artisan migrate:fresh
0 sử dụng đoạn mã sau public function up[]
{
Schema::create['users', function [Blueprint $table] {
$table->bigIncrements['id'];
$table->string['name'];
$table->string['timezone'];
$table->string['email']->unique[];
$table->timestamp['email_verified_at']->nullable[];
$table->string['password'];
$table->rememberToken[];
$table->timestamps[];
}];
}
Chạy lệnh thủ công sau để bỏ tất cả các bảng và chạy lại quá trình di chuyển
php artisan migrate:fresh
Lưu trữ múi giờ trong quá trình Đăng ký
Bây giờ chúng ta hãy đến phần mà chúng ta sẽ truy xuất múi giờ của người dùng trong quá trình đăng ký
Đưa đoạn mã sau vào cuối
php artisan migrate:fresh
1
$[ document ].ready[function[] {
$['#timezone'].val[moment.tz.guess[]]
}];
Với tập lệnh này, chúng tôi đang sử dụng plugin múi giờ theo thời điểm để truy xuất múi giờ của người dùng và sau đó chúng tôi sẽ đặt nó vào một trường ẩn bên trong biểu mẫu đăng ký
Thêm múi giờ làm trường ẩn trong biểu mẫu đăng ký
@csrf
Bây giờ khi bạn mở trang đăng ký [/register] và nhấp vào kiểm tra
Bạn sẽ tìm thấy múi giờ của người dùng như thế này
Ở đây chúng ta có thể thấy múi giờ là "Châu Á/Calcutta"
Bây giờ, phần tiếp theo là lấy múi giờ này sau khi đăng ký và lưu trữ nó trong cơ sở dữ liệu
Nhận múi giờ từ yêu cầu đăng khi đăng kýChúng tôi đang sử dụng phương pháp
php artisan migrate:fresh
2, được gọi mỗi khi người dùng mới đăng ký. Đối với điều này, chúng ta phải thêm dòng mã sau vào tệp php artisan migrate:fresh
3________số 8chúng tôi rất tốt để đi. khi người dùng nhấp vào đăng ký với tất cả các trường bắt buộc, múi giờ sẽ được lưu trữ trong cơ sở dữ liệu
Lưu trữ múi giờ trong khi đăng nhập
Quá trình tương tự cũng có thể được thực hiện trong quá trình đăng nhập, đối với điều này, bạn cần đưa cùng một tập lệnh vào cuối quá trình đăng nhập. lưỡi. php và sau đó bao gồm một trường ẩn trong biểu mẫu đăng nhập
@csrf
khi bạn có múi giờ trong biểu mẫu đăng nhập, giờ đây bạn có thể sử dụng phương thức Đã xác thực trong LoginController để lưu múi giờ trong bảng của người dùng trong cơ sở dữ liệu
public function up[]
{
Schema::create['users', function [Blueprint $table] {
$table->bigIncrements['id'];
$table->string['name'];
$table->string['timezone'];
$table->string['email']->unique[];
$table->timestamp['email_verified_at']->nullable[];
$table->string['password'];
$table->rememberToken[];
$table->timestamps[];
}];
}
0Bây giờ khi người dùng đăng nhập, nếu anh ta chưa có múi giờ trong cơ sở dữ liệu, nó sẽ được thêm vào
Bây giờ chúng ta đã hoàn thành việc tìm cách truy xuất và lưu trữ múi giờ của người dùng, Bây giờ chúng ta sẽ xem cách chúng ta có thể sử dụng múi giờ này để chuyển đổi dấu thời gian UTC thành múi giờ dành riêng cho người dùng
#2 Chuyển đổi UTC thành múi giờ của người dùng
Theo mặc định, dấu thời gian của Laravel bao gồm các trường
php artisan migrate:fresh
4 , php artisan migrate:fresh
5 trong bảng Mô hình được lưu trữ theo múi giờ UTC và điều này được chỉ định trong tệp php artisan migrate:fresh
6php artisan migrate:fresh
7Bây giờ chúng ta phải chuyển đổi rõ ràng theo múi giờ của người dùng bằng cách sử dụng trường "múi giờ" được lưu trữ
Chúng tôi sẽ sử dụng trình biến đổi của Laravel cho tác vụ này để mỗi khi một trường chứa dấu thời gian được yêu cầu từ cơ sở dữ liệu trước, nó sẽ đi qua trình biến đổi để chuyển đổi
Ví dụ: tôi đã chuyển đổi trường
php artisan migrate:fresh
4 mỗi lần trước khi hiển thị cho người dùng như sau public function up[]
{
Schema::create['users', function [Blueprint $table] {
$table->bigIncrements['id'];
$table->string['name'];
$table->string['timezone'];
$table->string['email']->unique[];
$table->timestamp['email_verified_at']->nullable[];
$table->string['password'];
$table->rememberToken[];
$table->timestamps[];
}];
}
6Nếu múi giờ của người dùng có trong cơ sở dữ liệu, nó sẽ được chuyển đổi thành múi giờ đó hoặc nó sẽ ở dạng UTC vì múi giờ mặc định của ứng dụng là "UTC"
Thưởng
Chúng tôi đã đề cập đến hai cách mà chúng tôi đang sử dụng javascript để phát hiện múi giờ của người dùng và sau đó chúng tôi lưu trữ múi giờ đó trong cơ sở dữ liệu, nếu bạn muốn người dùng của mình chọn múi giờ theo cách thủ công từ danh sách múi giờ hoặc nếu anh ấy muốn cập nhật múi giờ
Cho phép Người dùng Chọn/Thay đổi Múi giờ
Có một cách nữa, trong đó người dùng có thể chọn múi giờ hợp lệ một cách rõ ràng. Danh sách múi giờ do PHP cung cấp.
Đối với điều này, chúng tôi phải cung cấp danh sách thả xuống cho người dùng. nơi người dùng sẽ chọn múi giờ và múi giờ đó sẽ được lưu trữ trong bảng người dùng trong cơ sở dữ liệu.
public function up[]
{
Schema::create['users', function [Blueprint $table] {
$table->bigIncrements['id'];
$table->string['name'];
$table->string['timezone'];
$table->string['email']->unique[];
$table->timestamp['email_verified_at']->nullable[];
$table->string['password'];
$table->rememberToken[];
$table->timestamps[];
}];
}
7chúng tôi có thể lấy trường múi giờ này từ "yêu cầu" để lưu trữ trong cơ sở dữ liệu và để sau này chuyển đổi từ UTC sang múi giờ của người dùng