Bir kullanıcı aşağıdaki gibi tüm hafta boyunca onun "genel durumu" ayarlanmış olabilir, burada bir planlama uygulaması inşa ediyoruz:
Sunday | Monday | ... | Friday | Saturday
Biz onun "Boş" göstermek için Hindistan'da bir kişi A sorduğunuzda, size bunun gibi değerler şey aşağı bir damla seçmek için onu sormak:
12:00am
12:30am
01:00am
...
11:30pm
Biz zaman "Kimden" (başlangıç) ve zaman (biten) "Till" İKİ seçmesini isteyin.
Ne veritabanına kaydetmek SADECE bu değerler (aşağıdaki örneğe bakınız):
user_id avail_day from to
1 Sunday 12:00:00 12:15:00
2 Monday 12:00:00 12:15:00
Yani, özünde, (onun YEREL zaman diliminde) aşağıdaki gibi görünüyor
(A)
Sunday | Monday | ... | Friday | Saturday
-----------------------------------------
| | | | 8:30am to 10:30am
Bilgi ayrı bir parça olarak, biz o anda GMT + 05:30 saattir IST (Hint Standard Time), çalışmak için seçilmiş olduğunu biliyoruz, bu yüzden o anda var o seçer değerleri zaman dilimine İÇİN olduğunu varsayabiliriz Lütfen
Şimdi, şu anda GMT East Coast, bir kişi B - 4 saat (EDT), bu kez gerçekten olacak
Friday, 23:00:00 to Saturday, 01:00:00
We need help in figuring out how to:
(a) convert the earlier "text value" of the person A in IST to the local value of the EST person (NOTE that we know JUST the day and hours of availability as TEXT values)
(b) AND, then, we need to figure out how to display it on a "Standard week" beginning on a Sunday and ending on a Saturday.
What we want displayed should be something like this:
(B)
Sunday | Monday | ... | Friday | Saturday
--------------------------------------------------------------
| | | 11:00pm to 12:00am | 12:00am to 1:00am
(B) içine (A) dönüştürme herhangi bir akıllı yollar?
Bir genel fonksiyonu haline Artefacto 's kodu (Revizyon 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;
}