Ich speichere derzeit alle meine Daten in UTC. Wenn sich ein Benutzer anmeldet, verwendet er moment.js (die Funktion moment.tz.guess()), um eine versteckte Zeitzoneneingabe mit seinem Zeitzonennamen auszufüllen, z. B. Amerika/Toronto, und wenn sie sich dann anmelden, wird ihr Eintrag in der Datenbank mit der genannten Zeitzone aktualisiert.
Ich habe eine Accessor-Eigenschaft erstellt, um alle Daten in der Zeitzone des Benutzers anzuzeigen. Siehe diesen Code:
trait Timezone
{
public function getCreatedAtAttribute($value)
{
return $this->timezone($value);
}
public function getUpdatedAtAttribute($value)
{
return $this->timezone($value);
}
public function getDeletedAtAttribute($value)
{
return $this->timezone($value);
}
// convert date to user timezone
public function timezone($value)
{
$carbon = Carbon::parse($value);
if (auth()->check()) {
$carbon->tz(auth()->user()->timezone);
}
return $carbon->toDateTimeString();
}
}
Jetzt stoße ich auf ein kleines Problem. Ich habe eine Berichtsfunktion in der App und sie verfügt über ein Dropdown-Menü, in dem der Benutzer einen Datumsbereich wie „Diese Woche, Letzte Woche usw. auswählen kann.
Ich verwende UTC, um die Ergebnisse abzufragen, und konvertiere sie dann in die Zeitzone des Benutzers. Das Problem besteht darin, dass für einige Benutzer die Woche je nach Tageszeit von Dienstag bis Montag oder von Sonntag bis Samstag und nicht von Montag bis Sonntag angezeigt wird.
Hier ist mein Code dafür:
public static function dateStartEnd($date_range)
{
if ($date_range == 'Today') {
$start_date = Carbon::now()->startOfDay();
$end_date = Carbon::now()->endOfDay();
}
else if ($date_range == 'Yesterday') {
$start_date = Carbon::now()->subDay()->startOfDay();
$end_date = Carbon::now()->subDay()->endOfDay();
}
else if ($date_range == 'This Week') {
$start_date = Carbon::now()->startOfWeek();
$end_date = Carbon::now()->endOfWeek();
}
else if ($date_range == 'Last Week') {
$start_date = Carbon::now()->subWeek()->startOfWeek();
$end_date = Carbon::now()->subWeek()->endOfWeek();
}
else if ($date_range == 'This Month') {
$start_date = Carbon::now()->startOfMonth();
$end_date = Carbon::now()->endOfMonth();
}
else if ($date_range == 'Last Month') {
$start_date = Carbon::now()->subMonth()->startOfMonth();
$end_date = Carbon::now()->subMonth()->endOfMonth();
}
else {
// All Time
if ($lead = Lead::orderBy('created_at', 'asc')->first()) {
$start_date = Carbon::parse($lead->created_at);
}
else {
$start_date = Carbon::now()->startOfDay();
}
$end_date = Carbon::now()->endOfDay();
}
return [
'start_date' => $start_date,
'end_date' => $end_date,
];
}
Ich frage mich, wie ich das richtig machen kann, damit die Ergebnisse mit UTC abgefragt werden, aber Montag bis Sonntag in der Zeitzone des Benutzers angezeigt werden, unabhängig von der Zeitzone des Benutzers im Vergleich zu UTC.
Problem mit Benutzerzeitzonen in Laravel ⇐ Php
-
- Similar Topics
- Replies
- Views
- Last post