Diberikan MM-dd-yyyy
format tanggal , dapatkah seseorang membantu saya mendapatkan hari pertama dalam seminggu?
DateTime
solusi dan sebagian besar jawaban tidak memberikannya. =)
Diberikan MM-dd-yyyy
format tanggal , dapatkah seseorang membantu saya mendapatkan hari pertama dalam seminggu?
DateTime
solusi dan sebagian besar jawaban tidak memberikannya. =)
Jawaban:
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.
strtotime('this week', time());
Ganti waktu (). Metode minggu depan / senin terakhir tidak akan berfungsi jika hari ini adalah minggu / senin.
$monday = strtotime('last monday', strtotime('tomorrow'));
this week
tidak berfungsi jika Anda harus selalu memulai minggu sebelumnya, tetapi komentar @LewisBuckley melakukannya.
time()
adalah optionnal jika Anda ingin menentukan hari ini.
strtotime
Fungsi 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 :
2015-03-16
2015-03-22
2015-03-23
2015-03-22
2015-03-30
2015-03-29
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 :
2015-03-16
2015-03-22
2015-03-23
2015-03-29
2015-03-16
2015-03-22
2015-03-23
2015-03-22
2015-03-23
2015-03-22
2015-03-23
2015-03-29
2015-03-23
2015-03-29
2015-03-30
2015-03-29
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.
$dateTime = new \DateTime('2012-05-14');
DateTime
kelas inti , yang berarti kode tersebut akan berfungsi bahkan jika Anda memiliki kelas lain yang dipanggil DateTime
di namespace saat ini.
$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.
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.
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");
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
Dengan asumsi hari Senin sebagai hari pertama dalam seminggu, ini berfungsi:
echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));
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()));
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');
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
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"));
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 )
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);
?>
strtotime
lebih cepat dari new DateTime()->getTimestamp()
.
Gunakan saja date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));
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")).'
');
?>
$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"));
$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.
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)));
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
Anda mengurai tanggal menggunakan strptime()
dan menggunakan date()
hasil:
date('N', strptime('%m-%d-%g', $dateString));
<?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)
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');
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.
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"));
Ini satu baris untuk hari pertama minggu lalu, dan hari terakhir minggu lalu sebagai DateTime
objek.
$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);
$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"));
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 DateTime
kelas:
/**
* @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.
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.