PHP Verilen Bir Hafta boyunca Günleri Başlangıç ​​ve Bitiş olsun

10 Cevap php

Ben başlangıç ​​tarihi olarak Pazar kullanarak hafta aralık almaya çalışırken, bir referans tarih, $date söylüyorlar, ama ben sadece bunu anlamaya gibi olamaz değilim.

Ben 2009-05-01 $ olarak tarih olsaydı Örneğin, ben 2009/04/26 ve 2009/05/02 olacaktı. 2009-05-10 2009/05/10 ve 2009/05/16 doğuracak. Benim şu anki kod bu gibi görünüyor (ben onu kaldırdı nerede benim yorum url bastırmak için unuttum ben hatırlayamıyorum):

function x_week_range(&$start_date, &$end_date, $date)
{
    $start_date = '';
    $end_date = '';
    $week = date('W', strtotime($date));
    $week = $week;

    $start_date = $date;

    $i = 0;
    while(date('W', strtotime("-$i day")) >= $week) {
    	$start_date = date('Y-m-d', strtotime("-$i day"));
    	$i++;
    }

    list($yr, $mo, $da) = explode('-', $start_date);

    $end_date = date('Y-m-d', mktime(0, 0, 0, $mo, $da + 6, $yr));
}

Ben yaptım tüm geçerli tarihe 7 gün eklemek olduğunu fark etti. Bunu nasıl yapardın?

10 Cevap

PHP'nin strtotime harikaları advantange alacaktı:

function x_week_range(&$start_date, &$end_date, $date) {
    $ts = strtotime($date);
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
    $start_date = date('Y-m-d', $start);
    $end_date = date('Y-m-d', strtotime('next saturday', $start));
}

Verdiğiniz ve çalışır verisi üzerinde test. Özellikle bütün referans şey gibi olsa, devam sahip değilsiniz. Bu benim işlevi olsaydı, ben bu gibi olurdu:

function x_week_range($date) {
    $ts = strtotime($date);
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
    return array(date('Y-m-d', $start),
                 date('Y-m-d', strtotime('next saturday', $start)));
}

Ve bu gibi diyoruz:

list($start_date, $end_date) = x_week_range('2009-05-10');

Ben bu gibi şeyler için matematik yapmanın büyük bir hayranı değilim. Tarihler zor ve ben PHP rakam dışarı olmasını tercih.

PHP DateTime doc:

<?php
$date = new DateTime();

$date->setISODate(2008, 2);
$startDay = $date->format('Y-m-d');

$date->setISODate(2008, 2, 7);
$endDay = $date->format('Y-m-d');
?>

Görünüşe göre 'w' (tarih değerini biçimlendirme) veya bir DateTime nesne biçimi yöntemi (0 = Pazar, 1 = Pazartesi, vb varsayılan) bir sayı olarak haftanın gününü dönecektir

Siz haftanın başlangıcını bulmak için geçerli günden itibaren gün olarak değerini bu almak ve çıkarmak olabilir.

$start_date = new DateTime("2009-05-13");
$day_of_week = $start_date->format("w");

$start_date->modify("-$day_of_week day");

$ Start_date şimdi oradan haftanın sonuna ya da ne-si-sen almak için 7 gün ekleyebilirsiniz, bu hafta Pazar eşit olacaktır.

Ben bunun yerine http://boonedocks.net/mike/archives/114-Figuring-the-Start-of-the-Week-with-PHP.html de yaklaşımı ile gitmeye karar verdik.

Herkes hala mktime () kullanarak, strtotime () ve diğer PHP işlevleri ... PHP5 DateTime Class deneyin. Ben ilk başta tereddüt oldu ama kullanımı gerçekten çok kolay. Sizin nesneleri kopyalamak için () klonu kullanma hakkında unutma.

$dt_min = new DateTime("last sunday");
$dt_max = clone($dt_min);
$dt_max->modify('+6 days');

İhtiyacınız gibi Sonra biçimlendirmek.

echo 'This Week ('.$dt_min->format('m/d/Y').'-'.$dt_max->format('m/d/Y').')';

Erken kodu sizin dilimini ayarlamak için emin olun.

date_default_timezone_set('America/New_York');

İşte Clay benzer bir kavram kullanan benim sürümü bulunuyor:

/**
 * Start of the week
 *
 * 0 = Sun, 1 = Mon, etc.
 */
define( 'WEEK_START', 0 );

/**
 * Determine the start and end dates for
 * the week in which the specified date
 * falls
 *
 * @param $date Date in week
 * @param $start Week start (out)
 * @param $end Week end (out)
 */
function week_bounds( $date, &$start, &$end ) {
    $date = strtotime( $date );
    // Find the start of the week, working backwards
    $start = $date;
    while( date( 'w', $start ) > WEEK_START ) {
    	$start -= 86400; // One day
    }
    // End of the week is simply 6 days from the start
    $end = date( 'Y-m-d', $start + ( 6 * 86400 ) );
    $start = date( 'Y-m-d', $start );
}

Hafif test edilmiştir. Kod kurşun geçirmez, ya da uzak geçmişte ya da gelecekte tarihleri ​​idare edilemez. Kendi risk kullanın. Su kodu batırmayın. Bir sinir eğilim, ya da dolar işareti bir nefret olanlara kod görünmüyor. Hayvanlar üzerinde test edilmemiştir. Vejeteryanlar tarafından kullanımı için güvenlidir. Kod, hiç size konuşmak asla Yazar garanti. Kod konuşma sizi meşgul etmeye çalışın olası durumunda, yazar bunu veren her türlü tavsiye göz ardı etmek önerir.

@ Jjwdesign cevabı Base, ben DateTime sınıfını kullanarak, belirli bir tarih için bir haftanın başlangıç ​​ve bitiş hesaplayabilirsiniz bir fonksiyon geliştirdi. WILL WORK ON PHP 5.3.0++

Fark 0 arasında "başlangıç" (Pazartesi) ve 6 (Pazar) olarak istediğiniz gün ayarlayabilirsiniz olduğunu.

İşte fonksiyonu bulunuyor:

if(function_exists('grk_Week_Range') === FALSE){
    function grk_Week_Range($DateString, $FirstDay=6){
        #   Valeur par défaut si vide
        if(empty($DateString) === TRUE){
            $DateString = date('Y-m-d');
        }

        #   On va aller chercher le premier jour de la semaine qu'on veut
        $Days = array(
            0 => 'monday',
            1 => 'tuesday',
            2 => 'wednesday',
            3 => 'thursday',
            4 => 'friday',
            5 => 'saturday',
            6 => 'sunday'
        );

        #   On va définir pour de bon le premier jour de la semaine     
        $DT_Min = new DateTime('last '.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString);
        $DT_Max = clone($DT_Min);

        #   On renvoie les données
        return array(
            $DT_Min->format('Y-m-d'),
            $DT_Max->modify('+6 days')->format('Y-m-d')
        );
    }
}

Sonuçlar:

print_r(grk_Week_Range('2013-08-11 16:45:32', 0));
print_r(grk_Week_Range('2013-08-11 16:45:32', 1));
print_r(grk_Week_Range('2013-08-11 16:45:32', 2));
print_r(grk_Week_Range('2013-08-11 16:45:32', 3));
print_r(grk_Week_Range('2013-08-11 16:45:32', 4));
print_r(grk_Week_Range('2013-08-11 16:45:32', 5));
print_r(grk_Week_Range('2013-08-11 16:45:32', 6));

Array
(
    [0] => 2013-07-29
    [1] => 2013-08-04
)
Array
(
    [0] => 2013-07-30
    [1] => 2013-08-05
)
Array
(
    [0] => 2013-07-31
    [1] => 2013-08-06
)
Array
(
    [0] => 2013-07-25
    [1] => 2013-07-31
)
Array
(
    [0] => 2013-07-26
    [1] => 2013-08-01
)
Array
(
    [0] => 2013-07-27
    [1] => 2013-08-02
)
Array
(
    [0] => 2013-07-28
    [1] => 2013-08-03
)

Dürüst olmak gerekirse, ben sorun deftere kodu anlayış var ;)

Ben böyle bir şey hile yapmak gerekir sanırım:

function get_week($date) {
        $start = strtotime($date) - strftime('%w', $date) * 24 * 60 * 60;
        $end = $start + 6 * 24 * 60 * 60;
        return array('start' => strftime('%Y-%m-%d', $start),
                     'end' => strftime('%Y-%m-%d', $end));
}

Çok dize manipülasyon yapmadan, sen damgaları bazı basit matematik yapabilirsiniz.

function getDateRange(&$start, &$end, $date) {
  $seconds_in_day = 86400;
  $day_of_week = date("w", $date); 
  $start = $date - ($day_of_week * $seconds_in_day);
  $end = $date + ((6 - $day_of_week) * $seconds_in_day);
}

Paolo Bergantino tarafından kabul edilen cevabın daha akıcı bir sürümünü bulmak için çalışırken, ben bu halletmek için gerçekten güzel bir yol keşfetti:

function x_week_range2($date) {
  $ts = strtotime($date);
  $start = strtotime('sunday this week -1 week', $ts);
  $end = strtotime('sunday this week', $ts);
  return array(date('Y-m-d', $start), date('Y-m-d', $end));
}

'Pazar bu haftaki' dizesi her zaman "end Bu haftanın en Pazar" anlamına gelir. Pazar gününe denk bir zaman damgası üzerinde kullanıldığında, aşağıdaki Pazar olacaktır. Bu Paola'nın çözeltisi içinde üçlü operatör için ihtiyaç önlemek sağlar.