2017-09-12 6 views
0

J'ai un problème avec le calcul de la différence entre deux dates (incluant la date de fin) en utilisant le carbone. Voici le problème:Différence Date Calcul

J'utilise ce code (source: réponse de danharper à https://laracasts.com/discuss/channels/general-discussion/carbon-display-age-in-years-months-day?page=1):

$dateFrom = new Carbon("2017-01-01"); 
$dateTo = new Carbon("2017-12-31"); 
$dateTo = $dateTo->addDay(); //including End Date 

echo $dateFrom->diff($dateTo)->format('%y') . " year, <br>"; 
echo $dateFrom->diff($dateTo)->format('%m') . " month, <br>"; 
echo $dateFrom->diff($dateTo)->format('%d') . " day <br>"; 
echo "difference " . $dateFrom->diffInDays($dateTo) . " days <br>"; 

Scénario 1:

Disons que, $date1 = 2017-01-01 et $date2 = 2017-12-31, il y résultats:

1 year, 0 month, 0 day 
difference 365 days 

Quand je suis à l'aide de la calculatrice de date dans https://www.timeanddate.com/date/durationresult.html?d1=1&m1=1&y1=2017&d2=31&m2=12&y2=2017&ti=on, il va en résulter:

It is 365 days from the start date to the end date, end date included 
Or 1 year including the end date 

Ils aboutissent à la même réponse. MAIS:

Scénario 2:

$date1 = 2017-10-01 et $date2 = 2017-12-31, alors ça va les résultats:

0 year, 3 month, 1 day 
difference 92 days 

Utilisation de la calculatrice de date dans https://www.timeanddate.com/date/durationresult.html?d1=1&m1=10&y1=2017&d2=31&m2=12&y2=2017&ti=on, il va les résultats:

It is 92 days from the start date to the end date, end date included 
Or 3 months including the end date 

Le résultat dans timeanddate.com est exactement 3 mois SEULEMENT. Pas avec 1 jour. Je veux que le résultat soit 3 mois (la réponse de timeanddate.com).

Comment puis-je obtenir cette réponse? Ou, si cela ne peut pas être réalisé, y a-t-il une autre technique à réaliser: x months y days?
(ex: 1 jan 2017 ~ 5 feb 2019 = 25 months, 5 days)

Aidez-moi s'il vous plaît.

+1

Vous utilisez un même objet de date heure '$ dateFrom' pour la mesure de différence en termes de mois de l'année et le jour. En raison de l'utilisation du même objet, '$ dateTo' est soustraite encore et encore afin que votre résultat ne soit pas celui que vous voulez. –

+0

@SagarGautam alors, comment je suis censé faire la bonne façon? – joshua14

+0

J'ai ajouté ma réponse, veuillez prendre un moment pour la voir. –

Répondre

0

Vous pouvez changer votre code comme suit,

$dateFrom = new Carbon("2017-01-01"); 
$dateTo = new Carbon("2017-12-31"); 
$dateTo = $dateTo->addDay(); //including End Date 

$days = $dateFrom->diffInDays($dateTo); 
$months = $dateFrom->diffInMonths($dateTo); 
$years = $dateFrom->diffInYears($dateto); 

Dans votre code, vous avez mesuré différence plusieurs fois au lieu d'une seule fois. Utilisez diffInDays(), diffInMonths() et diffInYears() pour obtenir les valeurs des jours, des mois et des années entre deux dates.

J'espère que vous comprenez.

+0

qu'est ce que '$ datetime1' et' $ datetime2'? Et, est le 'diffInDays' de retour toute la différence? (1 oct à 31 dec = 92 jours) au lieu de 0 ans, 3 mois, 0 jours? – joshua14

+0

@ joshua14 J'ai mis à jour, –

+0

En fonction de votre réponse, si je: 'echo $ ans. " années " . $ mois. " mois " . $ jours. "jours", ', les résultats:' 0 ans 3 mois 92 jours' (?) – joshua14

0

Scénario 1

$start_date = new DateTime('1 Jan 2017'); 
$end_date = new DateTime('5 Feb 2019 +1 day'); 

$difference = $start_date->diff($end_date); 

$year_diff = $difference->format('%y'); 
$months_diff = $difference->format('%m'); 

$total_months = $months_diff + ($year_diff * 12); 

$output = $total_months . ' months ' . $difference->format('%d') . ' days'; 

// would output 25 months 5 days 

Scénario 2

$start_date = new DateTime('2017-10-01'); 
$end_date = new DateTime('2017-12-31 +1 day'); 

$difference = $start_date->diff($end_date); 

$year_diff = $difference->format('%y'); 
$months_diff = $difference->format('%m'); 

$total_months = $months_diff + ($year_diff * 12); 

$output = $total_months . ' months ' . $difference->format('%d') . ' days'; 

// would output 3 months 1 days 
+0

pour '$ start_date' = 2017-10-01, comment atteindre' 3 mois 0 jours' au lieu de 3 mois 1 jours? – joshua14

+0

Ne pas ajouter le jour inclus dans la date de fin – linktoahref

+0

Mais si je ne rajoute pas le jour inclus dans la date de fin, quand '$ start_date' = 2017-01-01, il va se traduire' 11 mois 29 jours' au lieu de '12 mois 0 jours' (?) – joshua14