Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Radzenie sobie ze strefami czasowymi w PHP i MySQL

strefy czasowe są denerwujące, nie ma co do tego wątpliwości. Jeśli dobrze rozumiem, chcesz, aby PHP zwracało czasy do widoku, które są w odpowiedniej strefie dla użytkownika, prawda?

To, co robię, znajduje się w „widoku głównym” lub jakimś pliku sort lub blade.php, który gwarantuje załadowanie co najmniej raz, sprawdzam, czy strefa czasowa tego użytkownika jest przechowywana w zmiennej sesji. Jeśli tak nie jest, wysyłam żądanie AJAX do serwera, aby zapisać nazwę strefy czasowej.

{{-- store timezone in session variables --}}
@if (!Session::has('timezone'))
    <script>
        $(function () {
            var tz = jstz.determine();
            var data = {};
            if (typeof (tz) !== 'undefined') {
                data.timezone = tz.name();
            }
            if (!$.isEmptyObject(data)) {
                $.ajax({
                    type: "POST",
                    url: "{{ url('/api/v1/settings') }}",
                    beforeSend: function (request) {
                        request.setRequestHeader("X-CSRF-TOKEN", "{{ csrf_token() }}");
                    },
                    data: $.param(data),
                });
            }
        });
    </script>
@endif

Zauważ, że to podejście wykorzystuje pakiet jstz, który możesz pobrać tutaj i uwzględnij w swoim <head> sekcja.

Oczywiście będziesz musiał ustawić trasę dla tego żądania, w moim przypadku wygląda to tak:

Route::post('api/v1/settings', function () {
    // Save the user's timezone
    if (Request::has('timezone')) {
        Session::put('timezone', Request::get('timezone'));
    }
});

Teraz, gdy chcesz przekonwertować podane ciągi daty i godziny w bazie danych na prawidłową strefę czasową, możesz uzyskać strefę czasową, mówiąc $tz = $request->session()->get('timezone') a następnie przeanalizuj daty za pomocą Carbon\Carbon::parse($date, $tz);

Ogólnie zalecałbym przechowywanie wszystkich dat w formacie UTC, ponieważ jest to standard i konieczne jest, aby baza danych pozostała niezależna od strefy czasowej. Ale jeśli chcesz zmienić wartość domyślną, możesz edytować wiersz 'timezone' => 'UTC' w config/app.php . Spowoduje to nadpisanie strefy, w której Laravel domyślnie ustawia swoje znaczniki czasowe, więc Twoje created_at, updated_at zostaną zmienione tak, aby odzwierciedlały tę nową strefę czasową.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Plik wsadowy dla mysqldump do tworzenia kopii zapasowych każdej bazy danych w osobnym pliku

  2. Normalizacja bazy danych dla systemu przesyłania wiadomości podobnego do Facebooka

  3. Jak odczytać ten plik tekstowy i wstawić do MySQL?

  4. Jak mogę wprowadzić dane w języku innym niż angielski (Bangla) do tej tabeli bazy danych?

  5. Błąd konwersji tablicy na ciąg znaków Symfony 3