Problem mit Benutzerzeitzonen in LaravelPhp

PHP-Programmierer chatten hier
Anonymous
 Problem mit Benutzerzeitzonen in Laravel

Post by Anonymous »

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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post