2016-04-15 15 views
5

mam datę w tej formie - - 20160428000000 (28 kwietnia 2016), tj rrrrmmdd ...dodać dni do miesiąca nieprzekraczającej ostatni dzień miesiąca php

muszę, że jeśli kilka dni (np. 3) są dodane do tej pory - to powinno dodać je, ale nie przekracza miesiąca (04) - oczekiwane wyjście - 20160430000000 - 30 kwietnia

Podobnie 20160226000000 + 5 dni powinien wrócić 20160229000000 czyli rok przestępny luty oznacza to, że nie powinno się skakać inny miesiąc.

Wszelkie wskazówki/pomysły?

+0

uzyskać interwał między datą i ostatnią datą miesiąca. Jeśli ten przedział jest krótszy niż podany przedział dodawania, po prostu zwróć ostatni dzień miesiąca. – mitkosoft

Odpowiedz

3

Inną alternatywą byłoby użyć DateTime zajęcia to sprawdzić:

Najpierw oczywiście stworzyć swój obiekt thru wejścia. Następnie ustaw obiekt dnia kończącego miesiąc.

Następnie należy dodać, a następnie sprawdzić, czy przekracza on dzień końcowy. Jeśli tak, ustaw ją na końcu, jeśli nie, to uzyskać wynik dodawania:

$day = 5; // days to be added 
$date = '20160226000000'; // input date 
$dt = DateTime::createFromFormat('YmdHis', $date); // create the input date 
$end = clone $dt; // clone/copy the input 
$end->modify('last day of this month'); // and set it to last day 
$dt->add(DateInterval::createFromDateString("+{$day} days")); // add x days 
// make comparision 
$final_date = ($dt > $end) ? $end->format('YmdHis') : $dt->format('YmdHis'); 
echo $final_date; 
+1

ładne i eleganckie! +1 – mitkosoft

+0

To też działa, bardzo dziękuję – jitendrapurohit

+0

Już miałem zaproponować coś podobnego za pomocą 'DateTimeImmutable', ale jest to w zasadzie ta sama logika. +1 :) – Narf

1

W tym celu można spróbować tak:

$given_date = 20160428000000; 
$no_of_day = 3; 

if(date('m',strtotime($given_date)) < date('m',strtotime($given_date ." +".$no_of_day."days"))){ 
    echo "Exceeded to next month <br/>"; 
    echo "Last date of month should be: ".date("t M Y", strtotime($given_date)); 
} 
else { 
    echo "Next date will be after ".$no_of_day." day(s)<br/>"; 
    echo date('d M Y',strtotime($given_date ." +".$no_of_day."days")); 
} 

Jeśli miesiące będzie przeskoczyć do następnego miesiąca, a następnie pokaże bieżący miesiąc ostatnią datę. w przeciwnym razie wyświetli datę po przedłużeniu liczby dni.

+0

Dzięki, ale czy to da mi ostatnią datę - 30 kwietnia? – jitendrapurohit

+0

@jitendrapurohit! Tak, spróbuję. – Yash

+0

Tak, to działa! Dzięki – jitendrapurohit

0

Jeżeli dodana data przekracza ostatni dzień, będzie wybrać ostatni dzień jako nową datę.

<?php 
$date_orig = 20160226000000; 
$add_day = 5; # No. of days to add 

$added_date  = strtotime($date_orig. ' + '.$add_day.' days'); // Add $add_day to $date_orig 
$last_date  = strtotime(date("YmtHis", strtotime($date_orig))); // Last day of $date_orig 
$new_date  = ($added_date > $last_date) ? $last_date : $added_date; // check the added date exceeds the last date 
$new_date_format = date("YmdHis", $new_date); // Format Date 

echo $new_date_format; 
?> 
Powiązane problemy