2013-12-10 23 views
1

的結束日期,我作爲UNIX時間戳PHP - 獲得啓動和當前的日期間隔

$now   = strtotime("2013-12-10"); 
$start_date = strtotime("2013-01-01"); 
$end_date = strtotime("2013-12-31"); 

$start date$end date跨度一​​段時間,$now時間戳坐在兩人的中間。

我也有像這樣的變量日期間隔:

$interval = new DateInterval('P1W'); 
// or 
$interval = new DateInterval('P3D'); 

鑑於上述情況我怎麼拿到now坐落在區間的開始和結束時間戳? $now,$start_date,$end_date並且間隔將是動態的。

可以說我有這些參數:

$start_date = '2013-01-01 00:00:00'; 
$end_date = '2013-12-31 23:59:59'; 
$now  = '2013-12-10 15:45:34'; 
$interval = new DateInterval('P1W'); 

我想知道的區間$現在坐在輸出的開始和結束日期我希望從上面。 params爲:

$int_start_date = '2013-12-10 00:00:00'; 
$int_end_date = '2013-12-16 23:59:59'; 
+0

閱讀本手冊PHP函數'date',你會知道該怎麼做:http://php.net/manual/en/function.date.php – Jurik

+0

我已經閱讀手冊多次但我不能想出解決方案來解決我的問題,因此我在這裏問。 – Brady

+0

您是否說現在您知道$的價值,並且您現在需要查找$ start_date和$ end_date的值,因爲$ now是4週期間的中間日期? – vascowhite

回答

1

我認爲這是一個比你更簡潔,更清潔的方法。

$start_date = new DateTime('2013-01-01 00:00:00'); 
$end_date  = new DateTime('2013-12-31 23:59:59'); 
$end_date_ts = $end_date->getTimestamp(); 
$now   = new DateTime('2013-12-10 15:45:34'); 
$now_ts  = $now->getTimestamp(); 
$interval  = new DateInterval('P1W'); 
$periods  = new DatePeriod($start_date, $interval, $end_date); 

/** @var \DateTime $period */ 
foreach($periods as $period){ 
    $periodEnd = clone $period; 
    $periodEnd->add($interval); 
    if($period < $now && $now < $periodEnd){ 
     $result = iterator_to_array(new \DatePeriod($period, $interval, $periodEnd->add($interval))); 
     $int_start_date = $result[0]; 
     $int_end_date = $result[1]; 
     break; 
    } 
} 

/** @var DateTime $int_start_date */ 
/** @var DateTime $int_end_date */ 
var_dump($int_start_date->format('Y-m-d H:i:s')); 
var_dump($int_end_date->modify('-1 Second')->format('Y-m-d H:i:s')); 
+0

上重新計算同一秒,而我同意這比我的解決方案更簡單,它不考慮間隔結束日期減去1秒。我用這個來報告數據庫中的事件,所以如果一個事件發生在00:00:00它會出現在兩個區間 – Brady

+0

要解決我要說的最後一行應該是:'var_dump($ int_end_date-> modify( '-1 Second') - > format('Ymd H:i:s'));' – Brady

+0

是的,你可以這樣做。隨意修改它,因爲你認爲適合你的用例。我很高興我們到達那裏:) – vascowhite

0

你可以嘗試:

$now = time(); 
$interval = new DateInterval('P1W'); 

$interval_seconds = $interval->s + ($interval->i * 60) + ($interval->h * 60 * 60) + ($interval->d * 60 * 60 * 24); 
$half_interval = round($interval_seconds/2); 

// Unix timestamps 
$interval_start = $now - $half_interval; 
$interval_end = $now + $half_interval; 

編輯:第二個答案從下面的評論對

的長度的間隔這僅適用於1 - 如1周,1年等

如果間隔爲> 1,那麼你就需要以某種方式確定你的間隔有多遠......例如,間隔2周,你是在第一週還是在第二週?

$now = time(); 

$interval = "week"; 

switch ($interval) { 
    case "year": 
     $start_int = strtotime(date("Y", $now)."-01-01 00:00:00"); 
     $end_int = strtotime(date("Y", $now)."-12-31 23:59:59"); 
    break; 
    case "month": 
     $start_int = strtotime(date("Y-m", $now)."-01 00:00:00"); 
     $end_int = strtotime(date("Y-m-t", $now)." 23:59:59"); 
    break; 
    case "week": 
     $start_week = date("Y-m-d", strtotime("previous Monday", $now)); 
     $end_week = date("Y-m-d", strtotime("next Sunday", $now)); 

     $start_int = strtotime($start_week." 00:00:00"); 
     $end_int = strtotime($end_week." 23:59:59"); 
    break; 
    case "day": 
     $start_int = strtotime(date("Y-m-d", $now)." 00:00:00"); 
     $end_int = strtotime(date("Y-m-d", $now)." 23:59:59"); 
    break; 
    case "hour": 
     $start_int = strtotime(date("Y-m-d H", $now).":00:00"); 
     $end_int = strtotime(date("Y-m-d H", $now).":59:59"); 
    break; 
    case "minute": 
     $start_int = strtotime(date("Y-m-d H:i", $now).":00"); 
     $end_int = strtotime(date("Y-m-d H:i", $now).":59"); 
    break; 
} 
echo date("Y-m-d H:i:s", $start_int), "<br>"; 
echo date("Y-m-d H:i:s", $end_int), "<br>"; 

更新3

我已經把邏輯從你的答案變成一個循環:

$start_date = new DateTime('2013-01-01 00:00:00'); 
$end_date  = new DateTime('2013-12-31 23:59:59'); 
$end_date_ts = $end_date->getTimestamp(); 
$now   = new DateTime('2013-12-10 15:45:34'); 
$now_ts  = $now->getTimestamp(); 
$interval  = new DateInterval('P1W'); 
$period  = new DatePeriod($start_date, $interval, $end_date); 

$int_start_date = $start_date; 
$int_end_date = $end_date; 

foreach ($period as $dt) { 
    $timestamp = $dt->getTimestamp(); 

    if ($now_ts >= $timestamp) { 
     $int_start_date->setTimestamp($timestamp); 
    } 
    if ($now_ts < $timestamp and $timestamp < $int_end_date->getTimestamp()) { 
     $int_end_date->setTimestamp($timestamp - 1); 
    } 
} 
var_dump($int_start_date->format('Y-m-d H:i:s')); 
var_dump($int_end_date->format('Y-m-d H:i:s')); 
0

我想通自己的問題不過是哈克

$start_date = new DateTime('2013-01-01 00:00:00'); 
$end_date  = new DateTime('2013-12-31 23:59:59'); 
$end_date_ts = $end_date->getTimestamp(); 
$now   = new DateTime('2013-12-10 15:45:34'); 
$now_ts  = $now->getTimestamp(); 
$interval  = new DateInterval('P1W'); 
$period  = new DatePeriod($start_date, $interval, $end_date); 

$intervals = array(); 

foreach ($period as $dt) { 
    $intervals[] = $dt->getTimestamp(); 
} 

$intervals[] = $end_date_ts; 
$int_start_date = new DateTime(); 
$int_end_date = new DateTime(); 

for ($i = 0; $i < count($intervals); $i++) { 
    if ($now_ts >= $intervals[$i] && $now_ts <= $intervals[$i+1]) { 
     $int_start_date->setTimestamp($intervals[$i]); 
     $int_end_date->setTimestamp($intervals[$i+1]-1); 
      break; 
    } 
} 

var_dump($int_start_date->format('Y-m-d H:i:s')); 
var_dump($int_end_date->format('Y-m-d H:i:s')); 

我很樂意接受更好的方法,如果任何人有他們。

+0

我剛剛運行了該代碼,並且在給定的日期得到的結果是2013年12月10日星期二作爲開始,2013年12月16日星期一結束。出於興趣,這是正確的解決方案嗎?我預計9日至15日(或8日至14日)。 – Jon

+0

我已經更新了我的答案,以反映您的方法,但只有一個循環,而不是兩個。 – Jon

+0

我提供了我認爲較少的'hacky'解決方案,您的意見可能會有所不同:) – vascowhite