Я создаю приложение, которое позволяет людям резервировать час времени каждый день.
Это не совсем календарь, так как он показывает только 7 дней (понедельник - солнце) и часы дня (0-23). Смотрите скриншот для справки.
Любой, где угодно может зарегистрироваться. Таким образом, человек в Майами может зарезервировать 12:00 - 13:00
на Sunday
, и это будет сохранено в БД как UTC. Когда кто-то в Нью-Йорке отправится посмотреть на это «расписание», он увидит, что кто-то зарезервировал час в воскресенье в 12:00.
Однако, если кто-то в Лос-Анджелесе смотрит на расписание, он также увидит, что этот час был зарезервирован в воскресенье, но его нужно будет сместить для своего часового пояса, поэтому он увидит, что 9:00 утра был зарезервирован Это работает как задумано.
Теперь вот проблема: если кто-то в Бангкоке зарезервирует час в воскресенье, как я получу этот 14-часовой зачет, чтобы кто-то в Лос-Анджелесе увидел его как понедельник, а не воскресенье, с правильным временем?
Я ломал голову над этим и не смог найти решение, потому что у нас фиксированное количество дней, и мы не работаем с датами, только дни и часы.
Функции
function daysOfTheWeek() {
return ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
}
function daysInTheWeek() {
$days = [];
for($i=1; $i<=7; $i++) {
$days[$i] = $i;
}
return $days;
}
function hoursinTheDay() {
$hours = [];
for($i=0; $i<=23; $i++) {
$hours[$i] = $i;
}
return $hours;
}
код
use Carbon\Carbon;
$hoursReserved = \DB::table('schedule')->get();
echo '<table border="1" cellpadding="2">';
echo '<tr>';
echo '<th>Hour</th>';
// print the days of the week (Monday - Sunday)
foreach(daysOfTheWeek() as $daw) {
echo '<th>'.$daw.'</th>';
}
echo '</tr>';
foreach(hoursinTheDay() as $hour) {
echo '<tr>';
echo '<td>';
// print the hours of the day (24 hour format)
echo Carbon::createFromFormat('H',$hour)->format('H:i').' - '.Carbon::createFromFormat('H',$hour)->addHour(1)->format('H:i');
echo '</td>';
// loop through the number of days in the week (1-7)
foreach(daysInTheWeek() as $day) {
// loop through the reserved hours
foreach($hoursReserved as $reservedHour) {
// if the hour reserved is in Bangkok, and the person is viewing it in Los Angeles, how to show that offset?
// stub in the timezones for testing
// $start = Carbon::createFromFormat('H:i:s', $reservedHour->start_at)->timezone('Asia/Bangkok')->format('H:i:s');
// $now = Carbon::createFromFormat('H:i:s', $reservedHour->start_at)->timezone('America/Los_Angeles')->format('H:i:s');
// dd($now);
if(($reservedHour->day == $day) && ($reservedHour->start_at == $hour)) {
// hour is reserved - this is working for local time
// I stripped out the conversion for NYC to LA for brevity
echo '<td>X</td>';
} else {
// hour is not reserved
echo '<td></td>';
}
}
}
echo '</tr>';
}
echo '</table>';
dd();
Route::get('/', function () {
return view('welcome');
});
Скриншот