你想把入境时间延长到两天吗?如果一个条目的结束时间小于开始时间,则将其拆分为两个条目。或者,如果你把日期和时间放在一起,比较一下日期,知道你是否需要拆分一个事件。您很可能需要在PHP.Hi jmz中执行此操作-修改了描述以使自己更清楚…:)请参见对JMZ的
你想把入境时间延长到两天吗?如果一个条目的结束时间小于开始时间,则将其拆分为两个条目。或者,如果你把日期和时间放在一起,比较一下日期,知道你是否需要拆分一个事件。您很可能需要在PHP.Hi jmz中执行此操作-修改了描述以使自己更清楚…:)请参见对JMZ的,php,datetime,time,timezone,Php,Datetime,Time,Timezone,你想把入境时间延长到两天吗?如果一个条目的结束时间小于开始时间,则将其拆分为两个条目。或者,如果你把日期和时间放在一起,比较一下日期,知道你是否需要拆分一个事件。您很可能需要在PHP.Hi jmz中执行此操作-修改了描述以使自己更清楚…:)请参见对JMZ的评论请参见对JMZ的评论只是一个注释:“标准周”(在ISO意义上)从周一开始,而不是周日。人工因素-人员a指定的时间都是“相对的”,不应因为夏令时而改变,等等。我不确定我应该采取什么“固定”日期,以及它将如何影响这些计算…@MrMHC“固定”是
你想把入境时间延长到两天吗?如果一个条目的结束时间小于开始时间,则将其拆分为两个条目。或者,如果你把日期和时间放在一起,比较一下日期,知道你是否需要拆分一个事件。您很可能需要在PHP.Hi jmz中执行此操作-修改了描述以使自己更清楚…:)请参见对JMZ的评论请参见对JMZ的评论只是一个注释:“标准周”(在ISO意义上)从周一开始,而不是周日。人工因素-人员a指定的时间都是“相对的”,不应因为夏令时而改变,等等。我不确定我应该采取什么“固定”日期,以及它将如何影响这些计算…@MrMHC“固定”是什么意思?固定相对什么?这个概念毫无意义。即使在UTC时区中指定了日期,日期也很重要,因为它决定了在位置B中应用哪些规则(不仅是DST,在这些年中,时区甚至可能在管理上发生变化)。至于参数化:从两次构建一个
DatePeriod
,然后立即将其分解为这两个日期是没有意义的。改为放入$indiaAvail
数组,其第一个元素是开始日期,最后一个元素是最后日期。您好,我不能很好地理解这个DatePeriod函数。你能告诉我如何修改上面的函数吗?请注意:“标准周”(ISO意义上)从周一开始,而不是周日。人工因素-人a指定的时间都是“相对的”,并且不应该因为夏令时而改变,等等。我不确定我应该采取什么“固定”日期,以及它将如何影响这些计算…@MrMHC“固定”是什么意思?固定相对什么?这个概念毫无意义。即使在UTC时区中指定了日期,日期也很重要,因为它决定了在位置B中应用哪些规则(不仅是DST,在这些年中,时区甚至可能在管理上发生变化)。至于参数化:从两次构建一个DatePeriod
,然后立即将其分解为这两个日期是没有意义的。改为放入$indiaAvail
数组,其第一个元素是开始日期,最后一个元素是最后日期。您好,我不能很好地理解这个DatePeriod函数。你能告诉我如何修改上面的函数吗?这看起来真的很棒!我仍然需要对它运行一些测试,但是您显示的示例输出看起来非常理想!再想想。。。该代码是否也允许在“查看”时区中从周六结束到周日开始的“滚动”?例如,活动在其他地方的任何时间开始,但转化为周六晚上11点到周日早上1点-上述代码可以处理那么好吗?@DrMHC当然可以,但它可以放入属于不同周的“周日”时段。见最后一段。顺便说一句,这需要PHP5.3,至少是人工因素-我参数化了你的代码(见主要问题)-你能评论一下我的方法中是否有任何问题吗?嗨,人工因素-希望你有机会看看这个。。。需要你的专业知识!这真是太棒了!我仍然需要对它运行一些测试,但是您显示的示例输出看起来非常理想!再想想。。。该代码是否也允许在“查看”时区中从周六结束到周日开始的“滚动”?例如,活动在其他地方的任何时间开始,但转化为周六晚上11点到周日早上1点-上述代码可以处理那么好吗?@DrMHC当然可以,但它可以放入属于不同周的“周日”时段。见最后一段。顺便说一句,这需要PHP5.3,至少是人工因素-我参数化了你的代码(见主要问题)-你能评论一下我的方法中是否有任何问题吗?嗨,人工因素-希望你有机会看看这个。。。需要你的专业知识!
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
Friday, 23:00:00 to Saturday, 01:00:00
(B)
Sunday | Monday | ... | Friday | Saturday
--------------------------------------------------------------
| | | 11:00pm to 12:00am | 12:00am to 1:00am
// 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;
}
$usersTZ = new DateTimeZone('EDT');
$now = new DateTime("now", $usersTZ);
$today = $now->format("Y-m-d");
$sql = "SELECT A.date, A.start, A.end, B.tz FROM schedule A JOIN users B ON (schedule.user_id = users.user_id) WHERE A.date BETWEEN '$sunday_minus_1_day' AND '$saturday_plus_1_day' ORDER BY A.date, A.start";
foreach ($db->dothequery($sql) as $event) {
$eventTZ = new DateTimeZone($event['tz']);
$eventStartDate = new DateTime("$today {$event['start']}", $eventTZ);
$eventStartDate->setTimeZone($usersTZ);
$eventEndDate = /* do the same for the end date */
if ($eventStartDate->format("Y-m-d") != $eventEndDate->format("Y-m-d")) {
/* create 2 events */
} else {
/* save the event to list of events with the new start and end times */
}
}
/* sort events, their order may be different now */
<?php
$tz1 = new DateTimezone("Asia/Calcutta");
$indiaAvail = array(
new DatePeriod(new DateTime("2010-08-01 10:00:00", $tz1),
new DateInterval("PT2H15M"), 1),
new DatePeriod(new DateTime("2010-08-07 03:00:00", $tz1),
new DateInterval("PT8H"), 1),
);
$tz2 = new DateTimezone("America/New_York");
//convert periods:
$times = array_map(
function (DatePeriod $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");
}
}
print_r($res);
Array
(
[Sunday] => Array
(
[0] => 12:30am to 2:45am
)
[Friday] => Array
(
[0] => 5:30pm to 11:59pm
)
[Saturday] => Array
(
[0] => 12:00am to 1:30am
)
)