Проблема с часовыми поясами пользователей в LaravelPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Проблема с часовыми поясами пользователей в Laravel

Сообщение Anonymous »

В настоящее время я храню все свои даты в формате UTC. Когда пользователь входит в систему, он использует moment.js (функция moment.tz.guess()) для заполнения скрытого ввода часового пояса именем своего часового пояса, например. Америка/Торонто, а затем, когда они входят в систему, он обновляет свою запись в базе данных с указанным часовым поясом.

У меня есть свойство доступа, которое я создал для отображения всех дат в часовом поясе пользователя. Посмотрите этот код:

Код: Выделить всё

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();
}
}
Теперь я столкнулся с небольшой проблемой. В моем приложении есть функция отчетов и раскрывающийся список, в котором пользователь может выбрать диапазон дат, например «Эта неделя», «Прошлая неделя» и т. д.

Я буду использовать UTC для запроса результатов, а затем конвертировать их в часовой пояс пользователя. Проблема в том, что для некоторых пользователей, в зависимости от времени суток, неделя отображается со вторника по понедельник или с воскресенья по субботу, а не с понедельника по воскресенье.

Вот мой код для этого:

Код: Выделить всё

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,
];
}
Мне интересно, как мне сделать это правильно, чтобы результаты запрашивались с использованием UTC, но отображались с понедельника по воскресенье в часовом поясе пользователя, независимо от часового пояса пользователя. по сравнению с UTC.

Подробнее здесь: https://stackoverflow.com/questions/488 ... in-laravel
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»