Как получить смещение часового пояса в Carbon, когда не работает с датами? - PullRequest
0 голосов
/ 23 мая 2019

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

Это не совсем календарь, так как он показывает только 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');
});

Скриншот

table

...