你想把入境时间延长到两天吗?如果一个条目的结束时间小于开始时间,则将其拆分为两个条目。或者,如果你把日期和时间放在一起,比较一下日期,知道你是否需要拆分一个事件。您很可能需要在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 ) )