PHP ile haftanın ilk günü mü alın?


124

Bir tarih MM-dd-yyyyformatı verildiğinde , birisi haftanın ilk gününü öğrenmeme yardım edebilir mi?


4
Haftanın ilk günü derken neyi kastediyorsunuz? Güneş mi demek istiyorsun, Mon? Yoksa haftanın ilk gününün tarihini mi kastediyorsunuz?
Jeffrey Hines

2
Haftanın ilk günü sabittir: Pazartesi (veya muhtemelen Pazar). Belirli bir keyfi tarihten önceki Pazartesi gününün tarihini almak istediğinizi mi söylüyorsunuz?
Jon Cram

PHP'nin hangi sürümü - 4 veya 5?
Jon Cram

haftanın pazar tarihi. php 5
Iggy Ma

Tuhaf, bir DateTimeçözüm istiyor ve cevapların çoğu bunu sağlamıyor. =)
lin

Yanıtlar:


143

İşte kullandığım şey ...

$day = date('w');
$week_start = date('m-d-Y', strtotime('-'.$day.' days'));
$week_end = date('m-d-Y', strtotime('+'.(6-$day).' days'));

$ gün , haftanın gününü temsil eden 0 ile 6 arasında bir sayı içerir (Pazar = 0, Pazartesi = 1, vb.).
$ week_start , geçerli haftanın Pazar gününü aa-gg-yyyy olarak içerir.
$ week_end , geçerli haftanın Cumartesi gününü aa-gg-yyyy olarak içerir.


1
ama bu 'bu hafta' başlangıcı ve sonu anlamına geliyor, değil mi?
Oki Erie Rinaldi

ya hafta numarası verilirse? ve o haftanın başlangıç ​​ve bitiş tarihini döndürmesini istiyorum.
Oki Erie Rinaldi

1
@OkiErieRinaldi Uygun ilgiyi görmek için muhtemelen yeni bir soru açmalısınız.
JadedCore

Merak etme, anladım @JadedCore!
Oki Erie Rinaldi

Diğeri neden daha yüksek olduğundan emin değilim. Çalışmıyor ama bu çalışıyor! 3v4l.org/q6kKY
Jason

67
strtotime('this week', time());

Zamanı değiştirin (). Gelecek pazar / son pazartesi yöntemleri, geçerli gün pazar / pazartesi olduğunda çalışmaz.


55
$monday = strtotime('last monday', strtotime('tomorrow'));
Lewis Buckley

this weekher zaman bir önceki hafta başlangıcına ihtiyacınız varsa çalışmaz, ancak @ LewisBuckley'in yorumu bunu yapar.
Smar

time()Bugün belirtmek istiyorsanız ikinci argüman isteğe bağlıdır.
Ifnot

benim için işe yaramadı, YTD, MTD, WTD için biraz farklı sözdizimi seçmem gerekiyordu.
Ron

6
Bu yanıt, kullanılan PHP sürümüne bağlı olarak tutarsız sonuçlar üretir: 3v4l.org/Z3k4E @ LewisBuckley'in çözümü tüm sürümler için tutarlıdır: 3v4l.org/Eeh9c
Chris Baker

62

strtotimeFonksiyonu kullanmak çok basit :

echo date("Y-m-d", strtotime('monday this week')), "\n";   

echo date("Y-m-d", strtotime('sunday this week')), "\n";

PHP sürümleri arasında biraz farklılık gösterir :

5.3.0 - 5.6.6, php7 @ 20140507 - 20150301, hhvm-3.3.1 - 3.5.1 için çıktı

2015-03-16
2015-03-22

4.3.5 - 5.2.17 için çıktı

2015-03-23
2015-03-22

4.3.0 - 4.3.4 için çıktı

2015-03-30
2015-03-29

Edge Durumlarında Karşılaştırma

Bu hafta gibi göreceli açıklamaların kendi bağlamları var. Aşağıdakiler, pazartesi veya pazar olduğunda bu hafta pazartesi ve pazar çıktılarını gösterir :

$date = '2015-03-16'; // monday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

$date = '2015-03-22'; // sunday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

Yine de PHP sürümleri arasında biraz farklılık gösterir :

5.3.0 - 5.6.6, php7 @ 20140507 - 20150301, hhvm-3.3.1 - 3.5.1 için çıktı

2015-03-16
2015-03-22
2015-03-23
2015-03-29

4.3.5 - 5.0.5, 5.2.0 - 5.2.17 için çıktı

2015-03-16
2015-03-22
2015-03-23
2015-03-22

5.1.0 - 5.1.6 için çıktı

2015-03-23
2015-03-22
2015-03-23
2015-03-29

4.3.0 - 4.3.4 için çıktı

2015-03-23
2015-03-29
2015-03-30
2015-03-29

bu neden 2016-06-05 tarihi için çalışmıyor, önümüzdeki haftalara tarih veriyor.

1
Bunun için teşekkürler, isteğe bağlı bir tarih parametresi $ dt = $ custom_date? strtotime ($ özel_tarih): zaman (); $ pazartesi = tarih ("Ymd", strtotime ('bu hafta pazartesi', $ dt)); $ pazar = tarih ("Ymd", strtotime ('bu hafta pazar', $ dt));
Ron Michael

47

Basit tutun:

<?php    
$dateTime = new \DateTime('2020-04-01');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');    
?>

Kaynak: PHP kılavuzu

Not: Bazı kullanıcıların yorum yaptığı gibi, $ dateTime değeri değiştirilecektir.


düzenleme: yazım hatası veya bilinmeyen bir sözdizimi? \ nereden geliyor? $dateTime = new \DateTime('2012-05-14');
Sliq

2
Bunu, uygulamanızın olası otomatik yüklenen nesnesiyle herhangi bir çakışmayı önlemek için yapıyorum. Bu mutlak yol veya göreceli yol gibi.
job3dot5

9
@Panique - "bilinmeyen sözdizimi" PHP 5.3'ün Ad alanı sözdizimidir. Ad aralığı, bir sınıfın önüne bir ad alanı ve ardından ters eğik çizgi eklemenize olanak tanır. Burada, çekirdek DateTimesınıfı belirtmek için bir ad alanı olmadan kullanıyor , bu DateTime, mevcut ad alanında başka bir sınıf çağrılmış olsa bile kodun çalışacağı anlamına gelir .
Spudley

Gün adı her zaman İngilizce mi?
Marwelln

1
Klon parçası düzgün çalışmıyor. İlk önce klonlamalı, ardından orijinaline ihtiyacınız varsa klon üzerinde işlem yapmalısınız.
Farid Movsumov

25
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));

Bu size verilen tarihin haftanın gününü verir; burada 0= Pazar ve 6= Cumartesi. Oradan, istediğiniz güne kadar geriye doğru hesaplayabilirsiniz.


6
Bu cevap, verilen bir tarihin pazar mı yoksa pazartesi mi olduğunu geri döndürür. Ancak, soru soran kişi, orijinal soruya yaptığı yorumda belirtildiği gibi, verilen tarihin haftanın pazar gününün tarihini sormuştur.
Rakib

19

Bu sorunun iyi bir DateTime cevabına ihtiyacı var : -

function firstDayOfWeek($date)
{
    $day = DateTime::createFromFormat('m-d-Y', $date);
    $day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1);
    return $day->format('m-d-Y');
}

var_dump(firstDayOfWeek('06-13-2013'));

Çıktı:-

string '06-10-2013' (length=10)

Bu, yıl sınırlarını ve artık yılları ele alacaktır.


18

DÜZENLEME: Aşağıdaki bağlantı belirtilen PHP sürümünde artık çalışmıyor. PHP 5.6 üzerinde çalışıyor, bu da strtotime'ın güvenilirliğini artırıyor, ancak mükemmel değil! Tablodaki sonuçlar PHP 5.6'dan canlı sonuçlardır.

Değeri ne olursa olsun, işte tutarlı bir referans çerçevesi belirlerken strtotime'ın riskli davranışının bir dökümü:

http://gamereplays.org/reference/strtotime.php

Temel olarak yalnızca bu dizeler, şu anda onları aradığınızda haftanın hangi gününde olursanız olun size güvenilir bir şekilde aynı tarihi verecektir:

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 

Makale ayrıca kullanmak için bazı özel kodlar verdi: $ start_of_week = strtotime ("gelecek pazartesi - 1 hafta"); // Geçerli haftanın Pazartesi günü 00:00:00 itibarıyla döndürülür "$ end_of_week = strtotime (" sonraki pazartesi - 1 saniye "); // 23:59:59'da biten geçerli haftanın Pazar günü döndürülür"
Scott M. Stolz

11

Aşağıdaki kod herhangi bir özel tarihle çalışmalıdır, sadece istenen tarih biçimini kullanır.

$custom_date = strtotime( date('d-m-Y', strtotime('31-07-2012')) ); 
$week_start = date('d-m-Y', strtotime('this week last monday', $custom_date));
$week_end = date('d-m-Y', strtotime('this week next sunday', $custom_date));
echo '<br>Start: '. $week_start;
echo '<br>End: '. $week_end;

Kodu PHP 5.2.17 Sonuçları ile test ettim:

Start: 30-07-2012
End: 05-08-2012

1
Bunun her zaman önceki Pazartesi gününe döneceğini belirtmek gerekir, bu nedenle $ custom_date bir Pazartesi ise, Pazartesi gününü bir hafta önce döndürür.
Hill79

2
Düzgün çalışmıyor, bugün pazar, sonuçlar: Başlangıç: 09-09-2013 Bitiş: 22-09-2013
user2019515

10

Pazartesi'yi haftanın ilk günü olarak kabul edersek, bu işe yarar:

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));

1
"MM-gg-yyyy", "Ymd" ile aynı değildir, lütfen yanıtınızı sorunun özelliklerine göre düzenleyin.
Yevgeniy Afanasyev

1
tarih ("AA-gg-yyyy"), tarihi şu şekilde verir: NovNov-0202-15151515. Umarım tarih şöyle olmalıdır: tarih ("Mdy"), örneğin: Kasım-02-15
shasi kanth

"MM-gg-yyyy" sorudan gelir. Ne anlama geldiğinden emin değilseniz - soruya bir yorumda sorun. Cevabınızı değiştirdiğiniz için teşekkür ederiz.
Yevgeniy Afanasyev

9

Buna ne dersin?

$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time()));
$last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));

8
Pazartesi günleri son pazartesi size bir önceki pazartesi günü verecektir.
Ikke

8

Herhangi bir tarihten haftanın ilk ve son gününü almak için kullandığım şey bu . Bu durumda pazartesi haftanın ilk günüdür ...

$date = date('Y-m-d') // you can put any date you want
$nbDay = date('N', strtotime($date));
$monday = new DateTime($date);
$sunday = new DateTime($date);
$monday->modify('-'.($nbDay-1).' days');
$sunday->modify('+'.(7-$nbDay).' days');

1
Gerçek cevap bu!
Manuel

1
Tıkır tıkır çalışıyor!
Liga

6

Burada Pazar gününü haftanın ilk günü ve Cumartesi gününü haftanın son günü olarak kabul ediyorum.

$m = strtotime('06-08-2012');  
$today =   date('l', $m);  
$custom_date = strtotime( date('d-m-Y', $m) );   
if ($today == 'Sunday') {  
   $week_start = date("d-m-Y", $m);  
} else {  
  $week_start = date('d-m-Y', strtotime('this week last sunday', $custom_date));  
}  

if ($today == 'Saturday') {  
  $week_end = date("d-m-Y", $m);
} else {  
  $week_end = date('d-m-Y', strtotime('this week next saturday', $custom_date));  
}
echo '<br>Start: '. $week_start;  
echo '<br>End: '. $week_end;  

Çıktı :

Başlangıç: 05-08-2012
Bitiş: 11-08-2012


5

Buna ne dersin?

$day_of_week = date('N', strtotime($string_date));
$week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
$week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));

4

Bunu dene:

function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y')
{
    $wk_ts  = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101'));
    $mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts);
    return date($format, $mon_ts);
}

$sStartDate = week_start_date($week_number, $year);
$sEndDate   = date('F d, Y', strtotime('+6 days', strtotime($sStartDate)));

( bu forum başlığından )


tüm bunlarda hafta numarasını ve yılı nasıl alırım? MM-gg-yyyy biçiminde bir dize
tarihim var

4

Bulduğum en kısa ve en okunaklı çözüm bu:

    <?php
    $weekstart = strtotime('monday this week');
    $weekstop = strtotime('sunday this week 23:59:59');
    //echo date('d.m.Y H:i:s', $weekstart) .' - '. date('d.m.Y H:i:s', $weekstop);
    ?>

strtotimedaha hızlıdır new DateTime()->getTimestamp().


Bu mükemmel, Avustralya / İngiltere tarihlerindeki düzeltmeye bakın
zanderwar

4

Sadece kullan date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));


2

PHP sürümü 5.3'ten önce verildiğinde, aşağıdaki işlev size belirli bir tarihte haftanın ilk gününü verir (bu durumda - Pazar, 2013-02-03):

<?php
  function startOfWeek($aDate){
    $d=strtotime($aDate);
    return strtotime(date('Y-m-d',$d).' - '.date("w",$d).' days');
  }

  echo(date('Y-m-d',startOfWeek("2013-02-07")).'
');
?>

2
$today_day = date('D'); //Or add your own date
$start_of_week = date('Ymd');
$end_of_week = date('Ymd');

if($today_day != "Mon")
    $start_of_week = date('Ymd', strtotime("last monday"));

if($today_day != "Sun")
                    $end_of_week = date('Ymd', strtotime("next sunday"));

2
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));

Önce bir sonraki pazartesiye, sonra da bir sonraki pazartesinin 'son pazartesi gününe' sahip olmalısınız. Yani verilen tarih pazartesi ise, geçen hafta pazartesi değil aynı tarihi döndürür.


2

Pazartesi'nin haftanızın başlangıcı olmasını istiyorsanız, şunu yapın:

$date = '2015-10-12';
$day = date('N', strtotime($date));
$week_start = date('Y-m-d', strtotime('-'.($day-1).' days', strtotime($date)));
$week_end = date('Y-m-d', strtotime('+'.(7-$day).' days', strtotime($date)));

Bunu bu cevaba veya bu cevaba tercih edilir kılan nedir ? Bana göre diğer 30
cevapta gereğinden

Teşekkürler. bu basit bir çözüm ve bir cazibe gibi çalışıyor.
Oleg Popov

2

Bunu yapmanın akıllıca bir yolu, PHP'nin saat dilimi farklılıklarını ve Yaz Saati Uygulamasını (DST) işlemesine izin vermektir. Bunu nasıl yapacağınızı göstermeme izin verin.

Bu işlev, Pazartesiden Cumaya kadar tüm günleri üretecektir (hafta içi çalışma günleri oluşturmak için kullanışlıdır):

class DateTimeUtilities {
    public static function getPeriodFromMondayUntilFriday($offset = 'now') {
        $now = new \DateTimeImmutable($offset, new \DateTimeZone('UTC'));
        $today = $now->setTime(0, 0, 1);

        $daysFromMonday = $today->format('N') - 1;

        $monday = $today->sub(new \DateInterval(sprintf('P%dD', $daysFromMonday)));
        $saturday = $monday->add(new \DateInterval('P5D'));

        return new \DatePeriod($monday, new \DateInterval('P1D'), $saturday);
    }
}

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday() as $day) {
    print $day->format('c');
    print PHP_EOL;
}

Bu, geçerli hafta için Pazartesi-Cuma günlerini döndürecektir. Rasgele bir tarih için aynısını yapmak için, parametre olarak bir tarihi şuraya iletin DateTimeUtilities ::getPeriodFromMondayUntilFriday, böylece:

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00') as $day) {
    print $day->format('c');
    print PHP_EOL;
}

//prints 
//2017-01-02T00:00:01+00:00
//2017-01-03T00:00:01+00:00
//2017-01-04T00:00:01+00:00
//2017-01-05T00:00:01+00:00
//2017-01-06T00:00:01+00:00

OP'nin sorduğu gibi sadece Pazartesi mi ilgileniyorsunuz?

$monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c');
print $monday;
// prints
//2017-01-02T00:00:01+00:00


1
<?php
/* PHP 5.3.0 */

date_default_timezone_set('America/Denver'); //Set apprpriate timezone
$start_date = strtotime('2009-12-15'); //Set start date

//Today's date if $start_date is a Sunday, otherwise date of previous Sunday
$today_or_previous_sunday = mktime(0, 0, 0, date('m', $start_date), date('d', $start_date), date('Y', $start_date)) - ((date("w", $start_date) ==0) ? 0 : (86400 * date("w", $start_date)));

//prints 12-13-2009 (month-day-year)
echo date('m-d-Y', $today_or_previous_sunday);

?>

(Not: Sorudaki MM, gg ve yyyy standart php tarih biçimi sözdizimi değildir - ne anlama geldiğinden emin olamıyorum, bu yüzden $ başlangıç_tarihini ISO yıl-ay-gün olarak ayarlıyorum)


1

Bunu yapmanın başka bir yolu ...

$year = '2014';
$month = '02';
$day = '26';

$date = DateTime::createFromFormat('Y-m-d H:i:s', $year . '-' . $month . '-' . $day . '00:00:00');
$day = date('w', $date->getTimestamp());

// 0=Sunday 6=Saturday
if($day!=0){

   $newdate = $date->getTimestamp() - $day * 86400;  //86400 seconds in a day

   // Look for DST change 
   if($old = date('I', $date->getTimestamp()) != $new = date('I', $newdate)){
       if($old == 0){
           $newdate -= 3600;  //3600 seconds in an hour
       } else {
           $newdate += 3600;
       }
   }

   $date->setTimestamp($newdate);
}

echo $date->format('D Y-m-d H:i:s');

1

Mevcut haftanın ilk gününü (Pazartesi) almanın en kolay yolu:

strtotime("next Monday") - 604800;

604800 - 1 hafta içindeki saniye sayısıdır (60 * 60 * 24 * 7).

Bu kod önümüzdeki Pazartesi günü alın ve 1 hafta için azaltın. Bu kod haftanın her günü işe yarar. Bugün Pazartesi olsa bile.


1

Saat dilimimin Avustralya olduğu ve strtotime()İngiltere tarihlerinden nefret ettiği için bunu oldukça sinir bozucu buldum .

Geçerli gün Pazar ise, strtotime("monday this week")sonraki gün dönecektir.

Bunun üstesinden gelmek için:

Dikkat : Bu yalnızca Avustralya / İngiltere tarihleri ​​için geçerlidir

$startOfWeek = (date('l') == 'Monday') ? date('d/m/Y 00:00') : date('d/m/Y', strtotime("last monday 00:00"));
$endOfWeek = (date('l') == 'Sunday') ? date('d/m/Y 23:59:59') : date('d/m/Y', strtotime("sunday 23:59:59"));

2
Bu, ABD tarihleri ​​için de geçerli. Bunu Newyork saat dilimi ile test ettim.
Jayesh D

Pazar, haftanın ilk gününüz olmadığı sürece (Avustralya / Birleşik Krallık'ta Pazartesi) o zaman sorun olmayacaktır.
zanderwar

1

İşte geçen haftanın ilk günü için bir satır ve DateTimenesne olarak geçen haftanın son günü .

$firstDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 7))
                             ->setTime(0, 0, 0);
$lastDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 1))
                            ->setTime(23, 59, 59);

1
$string_date = '2019-07-31';
echo $day_of_week = date('N', strtotime($string_date));
echo $week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
echo $week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));

Haftanın ilk günü (Pzt-Paz) Pazartesi olduğunda kullanışlıdır.
Kamran Mushtaq

0

Bu soruya birkaç kez karşı geldim ve tarih işlevlerinin bunu daha kolay veya net hale getirmemesine her zaman şaşırdım. İşte DateTimesınıfı kullanan PHP5 için çözümüm :

/**
 * @param DateTime $date A given date
 * @param int $firstDay 0-6, Sun-Sat respectively
 * @return DateTime
 */
function getFirstDayOfWeek(DateTime $date, $firstDay = 0) {
    $offset = 7 - $firstDay;
    $ret = clone $date;
    $ret->modify(-(($date->format('w') + $offset) % 7) . 'days');
    return $ret;
}

Orijinal tarihi değiştirmekten kaçınmak için klonlamak gerekir.


0

Ne dersin:

$date = "2013-03-18"; 
$searchRow = date("d.m.Y", strtotime('last monday',strtotime($date." + 1 day")));
echo "for date " .$date ." we get this monday: " ;echo $searchRow; echo '<br>';

Bu en iyi yol değil ama test ettim ve bu hafta içindeysem doğru pazartesiyi alıyorum ve eğer bir pazartesiysem o pazartesi alacağım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.