Мы создаем приложение для планирования, в котором один пользователь может установить свою «общедоступность» на все недели следующим образом:
Sunday | Monday | ... | Friday | Saturday
Когда мы просим человека А в Индии указать его «доступность», мы просим его выбрать из раскрывающегося списка значений что-то вроде этого:
12:00am
12:30am
01:00am
...
11:30pm
Мы просим его выбрать ОБА время «От» (начало) и «До» (окончание).
В базе данных мы сохраняем просто эти значения (см. Следующий пример):
user_id avail_day from to
1 Sunday 12:00:00 12:15:00
2 Monday 12:00:00 12:15:00
Итак, по сути, это выглядит следующим образом (в его МЕСТНОМ часовом поясе)
(A)
Sunday | Monday | ... | Friday | Saturday
-----------------------------------------
| | | | 8:30am to 10:30am
Как отдельная часть информации, мы знаем, что он выбрал работу в IST (индийское стандартное время), которое в настоящее время составляет GMT + 5:30 часов, поэтому мы можем предположить, что значения, которые он выбирает, относятся к времени зона, в которой он сейчас находится.
Теперь для человека B на Восточном побережье, которое в настоящее время составляет GMT - 4 часа (EDT), это время будет фактически
Friday, 23:00:00 to Saturday, 01:00:00
Нам нужна помощь в выяснении того, как:
(a) преобразуйте предыдущее «текстовое значение» лица A в IST в локальное значение лица EST (ОБРАТИТЕ ВНИМАНИЕ, что мы знаем ПРОСТО день и часы доступности как значения TEXT)
(б) И, затем, мы должны выяснить, как отобразить его на «Стандартной неделе», начинающейся в воскресенье и заканчивающейся в субботу.
То, что мы хотим отобразить, должно выглядеть примерно так:
(B)
Sunday | Monday | ... | Friday | Saturday
--------------------------------------------------------------
| | | 11:00pm to 12:00am | 12:00am to 1:00am
Какие-нибудь умные способы преобразования (A) в (B)?
Artefacto * Код 1029 *, преобразованный в универсальную функцию (Редакция 2)
// This function should be used relative to a "from_date"
// The $from_timebegin and $from_timeend MUST be for the same day, not rolling over to the next
function shift_timezones_onweek3($from_timezone, $from_date, $from_timebegin, $from_timeend, $to_timezone)
{
$tz1 = new DateTimezone($from_timezone);
$datetime1 = new DateTime("$from_date $from_timebegin", $tz1);
$datetime2 = new DateTime("$from_date $from_timeend", $tz1);
$interval = $datetime1->diff($datetime2);
$indiaAvail = array(
array($datetime1, $datetime2)
);
$tz2 = new DateTimezone($to_timezone);
//convert periods:
$times = array_map(
function (array $p) use ($tz2) {
$res = array();
foreach ($p as $d) {
$res[] = $d->setTimezone($tz2);
}
return $res;
},
$indiaAvail
);
$res = array();
foreach ($times as $t) {
$t1 = reset($t);
$t2 = next($t);
if ($t1->format("d") == $t2->format("d")) {
$res[$t1->format("l")][] = $t1->format("g:ia") . " to ".
$t2->format("g:ia");
}
else {
$res[$t1->format("l")][] = $t1->format("g:ia") . " to 11:59pm";
$res[$t2->format("l")][] = "12:00am to ". $t2->format("g:ia");
}
}
return $res;
}