Dapatkan hari pertama dalam seminggu di PHP?

124

Diberikan MM-dd-yyyyformat tanggal , dapatkah seseorang membantu saya mendapatkan hari pertama dalam seminggu?

Iggy Ma
sumber
4
Apa yang Anda maksud dengan hari pertama dalam seminggu? Apakah yang Anda maksud Sun, Mon? Atau maksud Anda tanggal dari hari pertama dalam seminggu?
Jeffrey Hines
2
Hari pertama dalam minggu itu konstan: hari Senin (atau mungkin Minggu). Apakah Anda bermaksud untuk mendapatkan tanggal Senin sebelum tanggal sewenang-wenang tertentu?
Jon Cram
Versi PHP - 4 atau 5 apa?
Jon Cram
tanggal minggu dalam seminggu. php 5
Iggy Ma
Aneh, dia meminta DateTimesolusi dan sebagian besar jawaban tidak memberikannya. =)
lin

Jawaban:

143

Inilah yang saya gunakan ...

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

$ day berisi angka dari 0 hingga 6 yang mewakili hari dalam seminggu (Minggu = 0, Senin = 1, dll.).
$ week_start berisi tanggal untuk hari Minggu dari minggu ini sebagai bb-hh-tttt.
$ week_end berisi tanggal untuk hari Sabtu dari minggu ini sebagai bb-hh-tttt.

JadedCore
sumber
1
Tapi, itu artinya awal dan akhir dari 'minggu ini', bukan?
Oki Erie Rinaldi
bagaimana jika nomor minggu diberikan? dan saya ingin mengembalikan tanggal awal dan akhir minggu itu.
Oki Erie Rinaldi
1
@OkiErieRinaldi Anda mungkin harus membuka pertanyaan baru untuk mendapatkan perhatian yang tepat.
JadedCore
Jangan khawatir ,, saya mengerti @JadedCore!
Oki Erie Rinaldi
Saya tidak yakin mengapa yang lain lebih tinggi. Itu tidak berhasil, tapi yang ini berhasil! 3v4l.org/q6kKY
Jason
67
strtotime('this week', time());

Ganti waktu (). Metode minggu depan / senin terakhir tidak akan berfungsi jika hari ini adalah minggu / senin.

laurentb.dll
sumber
55
$monday = strtotime('last monday', strtotime('tomorrow'));
Lewis Buckley
this weektidak berfungsi jika Anda harus selalu memulai minggu sebelumnya, tetapi komentar @LewisBuckley melakukannya.
Smar
Argumen kedua time()adalah optionnal jika Anda ingin menentukan hari ini.
Ifnot
tidak bekerja untuk saya, saya harus melihat sintaks yang sedikit berbeda untuk YTD, MTD, WTD.
Ron
6
Jawaban ini memberikan hasil yang tidak konsisten, bergantung pada versi PHP yang digunakan: 3v4l.org/Z3k4E @ Solusi LewisBuckley konsisten untuk semua versi: 3v4l.org/Eeh9c
Chris Baker
62

strtotimeFungsi yang sangat mudah digunakan :

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

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

Ini sedikit berbeda di semua versi PHP :

Output untuk 5.3.0 - 5.6.6, php7 @ 20140507 - 20150301, hhvm-3.3.1 - 3.5.1

2015-03-16
2015-03-22

Output untuk 4.3.5 - 5.2.17

2015-03-23
2015-03-22

Output untuk 4.3.0 - 4.3.4

2015-03-30
2015-03-29

Membandingkan di Edge-Cases

Deskripsi relatif seperti minggu ini memiliki konteksnya masing-masing. Berikut ini adalah output untuk minggu ini senin dan minggu ketika itu adalah hari senin atau minggu:

$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";

Againt itu sedikit berbeda di semua versi PHP :

Output untuk 5.3.0 - 5.6.6, php7 @ 20140507 - 20150301, hhvm-3.3.1 - 3.5.1

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

Output untuk 4.3.5 - 5.0.5, 5.2.0 - 5.2.17

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

Output untuk 5.1.0 - 5.1.6

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

Output untuk 4.3.0 - 4.3.4

2015-03-23
2015-03-29
2015-03-30
2015-03-29
Raja Rama Mohan Thavalam
sumber
mengapa ini tidak berfungsi untuk tanggal 2016-06-05, ini memberikan tanggal minggu depan.
1
Terima kasih untuk ini, saya baru saja memodifikasi kode ini sehingga saya dapat meneruskan parameter tanggal opsional $ dt = $ custom_date? strtotime ($ custom_date): waktu (); $ monday = date ("Ymd", strtotime ('monday this week', $ dt)); $ sunday = date ("Ymd", strtotime ('sunday this week', $ dt));
Ron Michael
47

Tetap sederhana:

<?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');    
?>

Sumber: manual PHP

NB: karena beberapa pengguna berkomentar, nilai $ dateTime akan diubah.

job3dot5
sumber
edit: salah ketik atau beberapa sintaks yang tidak diketahui? dari mana \ berasal? $dateTime = new \DateTime('2012-05-14');
Sliq
2
Saya melakukan ini untuk menghindari konflik dengan kemungkinan objek yang dimuat otomatis dari aplikasi Anda. Itu seperti jalur absolut atau jalur relatif.
job3dot5
9
@ Panique - "sintaks yang tidak diketahui" adalah sintaks Namespace PHP 5.3. Namespacing memungkinkan Anda untuk memberi awalan kelas dengan namespace diikuti dengan garis miring terbalik. Di sini dia menggunakannya tanpa namespace untuk menentukan DateTimekelas inti , yang berarti kode tersebut akan berfungsi bahkan jika Anda memiliki kelas lain yang dipanggil DateTimedi namespace saat ini.
Spudley
Apakah nama hari selalu dalam bahasa Inggris?
Marwelln
1
Bagian klon tidak berfungsi dengan benar. Anda harus mengkloning terlebih dahulu kemudian melakukan operasi pada klon jika Anda membutuhkan yang asli.
Farid Movsumov
25
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));

Ini memberi Anda hari dalam seminggu dari tanggal tertentu itu sendiri di mana 0= Minggu dan 6= Sabtu. Dari sana Anda cukup menghitung mundur ke hari yang Anda inginkan.

Yuvalik
sumber
6
Jawaban ini mengembalikan apakah tanggal tertentu adalah hari Minggu atau Senin, dll. Tetapi, penanya telah menanyakan tanggal minggu dalam minggu dari tanggal yang ditentukan seperti yang disebutkan dalam komentarnya tentang pertanyaan asli.
Rakib
19

Pertanyaan ini membutuhkan jawaban DateTime yang bagus : -

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'));

Keluaran:-

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

Ini akan berurusan dengan batas tahun dan tahun kabisat.

vascowhite.dll
sumber
18

EDIT: tautan di bawah ini tidak lagi berjalan pada versi PHP yang disebutkan. Ini berjalan pada PHP 5.6 yang meningkatkan keandalan strtotime, tetapi tidak sempurna! Hasil dalam tabel adalah hasil langsung dari PHP 5.6.

Untuk apa nilainya, berikut adalah perincian dari perilaku strtotime yang miring saat menentukan kerangka acuan yang konsisten:

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

Pada dasarnya, hanya string ini yang dapat diandalkan memberi Anda tanggal yang sama, tidak peduli hari apa dalam seminggu Anda saat ini saat Anda memanggilnya:

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 
AgmLauncher
sumber
Artikel tersebut juga memberikan beberapa kode khusus untuk digunakan: $ start_of_week = strtotime ("senin depan - 1 minggu"); // Akan kembali hari Senin minggu ini mulai pukul 00:00:00 "$ end_of_week = strtotime (" senin depan - 1 detik "); // Akan kembali hari Minggu dari minggu ini yang berakhir pada pukul 23:59:59"
Scott M. Stolz
11

Kode berikut harus berfungsi dengan tanggal khusus apa pun, cukup gunakan format tanggal yang diinginkan.

$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;

Saya menguji kode dengan PHP 5.2.17. Hasil:

Start: 30-07-2012
End: 05-08-2012
Malagana
sumber
1
Perlu dicatat bahwa ini akan selalu mengembalikan hari Senin sebelumnya, jadi jika $ custom_date adalah hari Senin, itu akan mengembalikan tanggal Senin satu minggu sebelumnya.
Hill79
2
Tidak berfungsi dengan baik, hari ini hari Minggu, hasilnya: Mulai: 09-09-2013 Selesai: 22-09-2013
pengguna2019515
10

Dengan asumsi hari Senin sebagai hari pertama dalam seminggu, ini berfungsi:

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));
shasi kanth
sumber
1
"BB-hh-tttt" tidak sama dengan "Ymd", sesuaikan jawaban Anda dengan pertanyaan spesifik.
Yevgeniy Afanasyev
1
tanggal ("MM-dd-yyyy") menghasilkan tanggal sebagai: NovNov-0202-15151515. Saya berharap seharusnya: tanggal ("Mdy") yang menghasilkan tanggal yang dapat dibaca seperti: Nov-02-15
shasi kanth
"MM-dd-yyyy" berasal dari pertanyaan. Jika Anda tidak yakin apa artinya - tanyakan dalam komentar untuk pertanyaan. Terima kasih telah mengubah jawaban Anda.
Yevgeniy Afanasyev
9

Bagaimana dengan ini?

$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time()));
$last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));
birkof.dll
sumber
8
Senin terakhir pada hari Senin akan memberi Anda hari Senin sebelumnya.
Ikke
8

Inilah yang saya gunakan untuk mendapatkan hari pertama dan terakhir dalam seminggu dari tanggal berapa pun . Dalam hal ini, senin adalah hari pertama dalam seminggu ...

$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');
ThEBiShOp
sumber
1
Itulah jawaban sebenarnya!
Manuel
1
Bekerja seperti pesona!
Liga
6

Di sini saya menganggap Minggu sebagai hari pertama & Sabtu sebagai hari terakhir dalam seminggu.

$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;  

Keluaran:

Mulai: 05-08-2012
Selesai: 11-08-2012

Irshad Sheikh
sumber
5

Bagaimana dengan ini?

$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"));
Tarquinius Superbus
sumber
4

Coba ini:

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)));

(dari utas forum ini )

James Skidmore
sumber
bagaimana cara mendapatkan nomor minggu dan tahun di semua itu? Saya memiliki tanggal string dalam format MM-dd-yyyy
Iggy Ma
4

Ini adalah solusi terpendek dan paling mudah dibaca yang saya temukan:

    <?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);
    ?>

strtotimelebih cepat dari new DateTime()->getTimestamp().

dipser
sumber
Ini sempurna, lihat perbaikan saya untuk tanggal Australia / Inggris
zanderwar
4

Gunakan saja date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));

Kondziutek
sumber
2

Diberikan fungsi PHP versi sebelum 5.3 berikut memberi Anda hari pertama dari minggu yang ditentukan tanggal (dalam hal ini - Minggu, 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")).'
');
?>
David Jashi
sumber
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"));
pengguna195257
sumber
2
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));

Anda harus mendapatkan hari Senin berikutnya terlebih dahulu, kemudian mendapatkan 'Senin terakhir' pada hari Senin berikutnya. Jadi jika tanggal yang diberikan adalah hari senin maka akan mengembalikan tanggal yang sama bukan minggu lalu senin.

Fedy Venom
sumber
2

Jika Anda ingin hari Senin sebagai awal minggu Anda, lakukan ini:

$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)));
Henry Weber
sumber
Apa yang membuat ini lebih disukai daripada jawaban ini , atau jawaban ini ? Menurut saya ada lebih dari cukup pilihan dalam 30 jawaban lainnya ...
Mogsdad
Terima kasih. ini adalah solusi sederhana dan bekerja dengan sangat baik.
Oleg Popov
2

Cara cerdas untuk melakukan ini adalah membiarkan PHP menangani perbedaan zona waktu dan Daylight Savings Time (DST). Izinkan saya menunjukkan kepada Anda bagaimana melakukan ini.

Fungsi ini akan menghasilkan semua hari dari Senin sampai Jumat, inklusif (berguna untuk membuat hari kerja):

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;
}

Ini akan mengembalikan waktu Senin-Jumat untuk minggu ini. Untuk melakukan hal yang sama pada tanggal arbitrer, teruskan tanggal sebagai parameter ke DateTimeUtilities ::getPeriodFromMondayUntilFriday, dengan demikian:

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

Hanya tertarik pada hari Senin, seperti yang diminta OP?

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

Anda mengurai tanggal menggunakan strptime()dan menggunakan date()hasil:

date('N', strptime('%m-%d-%g', $dateString));
Soulmerge
sumber
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);

?>

(Catatan: MM, dd dan yyyy di Pertanyaan bukanlah sintaks format tanggal php standar - Saya tidak yakin apa yang dimaksud, jadi saya menyetel $ start_date dengan ISO tahun-bulan-hari)

micahwittman
sumber
1

Cara lain untuk melakukannya ....

$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');
Michael Pawlowsky
sumber
1

Cara termudah untuk mendapatkan hari pertama (Senin) minggu ini adalah:

strtotime("next Monday") - 604800;

di mana 604800 - adalah hitungan detik dalam 1 minggu (60 * 60 * 24 * 7).

Kode ini didapat hari Senin depan dan diturunkan selama 1 minggu. Kode ini akan bekerja dengan baik setiap hari dalam seminggu. Bahkan jika hari ini adalah hari Senin.

Anton Popov
sumber
1

Saya merasa ini cukup membuat frustrasi mengingat zona waktu saya adalah Australia dan itu strtotime() menyukai tanggal Inggris.

Jika hari ini adalah hari Minggu, maka strtotime("monday this week")akan kembali pada hari berikutnya.

Untuk mengatasinya:

Perhatian : Ini hanya berlaku untuk tanggal Australia / Inggris

$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"));
zanderwar
sumber
2
Ini juga berlaku untuk tanggal USA. Saya telah menguji ini dengan zona waktu Newyork.
Jayesh D
Selama hari Minggu bukan hari pertama Anda dalam seminggu (Senin di Australia / Inggris) maka itu akan baik-baik saja.
zanderwar
1

Ini satu baris untuk hari pertama minggu lalu, dan hari terakhir minggu lalu sebagai DateTimeobjek.

$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);
David Baucum
sumber
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"));
Syed Urooj Waqar
sumber
Berguna saat kita memiliki hari Senin sebagai hari pertama dalam seminggu (Sen-Ming).
Kamran Mushtaq
0

Saya telah menjawab pertanyaan ini beberapa kali dan selalu terkejut bahwa fungsi tanggal tidak membuatnya lebih mudah atau lebih jelas. Inilah solusi saya untuk PHP5 yang menggunakan DateTimekelas:

/**
 * @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;
}

Diperlukan untuk mengkloning agar tidak mengubah tanggal asli.

contrebis
sumber
0

Bagaimana dengan:

$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>';

Ini bukan cara terbaik tetapi saya menguji dan jika saya dalam minggu ini saya mendapatkan hari Senin yang benar, dan jika saya pada hari Senin saya akan mendapatkannya hari Senin.

CoffeJunky
sumber