Bir tarih MM-dd-yyyyformatı verildiğinde , birisi haftanın ilk gününü öğrenmeme yardım edebilir mi?
DateTimeçözüm istiyor ve cevapların çoğu bunu sağlamıyor. =)
Bir tarih MM-dd-yyyyformatı verildiğinde , birisi haftanın ilk gününü öğrenmeme yardım edebilir mi?
DateTimeçözüm istiyor ve cevapların çoğu bunu sağlamıyor. =)
Yanıtlar:
İş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.
strtotime('this week', time());
Zamanı değiştirin (). Gelecek pazar / son pazartesi yöntemleri, geçerli gün pazar / pazartesi olduğunda çalışmaz.
$monday = strtotime('last monday', strtotime('tomorrow'));
this weekher zaman bir önceki hafta başlangıcına ihtiyacınız varsa çalışmaz, ancak @ LewisBuckley'in yorumu bunu yapar.
time()Bugün belirtmek istiyorsanız ikinci argüman isteğe bağlıdır.
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 :
2015-03-16
2015-03-22
2015-03-23
2015-03-22
2015-03-30
2015-03-29
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 :
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
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.
$dateTime = new \DateTime('2012-05-14');
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 .
$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.
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.
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");
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
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())));
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');
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
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"));
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)));
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().
Sadece kullan date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));
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")).'
');
?>
$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))));
Ö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.
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 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
Sonucu kullanarak tarihi ayrıştırır strptime()ve kullanırsınız date():
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);
?>
(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)
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');
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.
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"));
İş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);
$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"));
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.
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.