जॉन कोंडे ने अपनी इस विधि में सब ठीक प्रक्रियाओं करता है लेकिन अपने प्रश्न का अंतिम चरण है जो करने के लिए है संतुष्ट नहीं करता अपने विनिर्देशों के परिणाम स्वरूपित करें।
इस कोड (Demo), कच्चे अंतर प्रदर्शित करेगा तुरंत कच्चे अंतर फ़ॉर्मेट करने के लिए कोशिश कर रहा है के साथ परेशानी का पर्दाफाश मेरी तैयारी चरणों प्रदर्शित करते हैं, और अंत में सही ढंग से प्रारूपित परिणाम प्रस्तुत करते हैं:
$datetime1 = new DateTime('2017-04-26 18:13:06');
$datetime2 = new DateTime('2011-01-17 17:13:00'); // change the millenium to see output difference
$diff = $datetime1->diff($datetime2);
// this will get you very close, but it will not pad the digits to conform with your expected format
echo "Raw Difference: ",$diff->format('%y years %m months %d days %h hours %i minutes %s seconds'),"\n";
// Notice the impact when you change $datetime2's millenium from '1' to '2'
echo "Invalid format: ",$diff->format('%Y-%m-%d %H:%i:%s'),"\n"; // only H does it right
$details=array_intersect_key((array)$diff,array_flip(['y','m','d','h','i','s']));
echo '$detail array: ';
var_export($details);
echo "\n";
array_map(function($v,$k)
use(&$r)
{
$r.=($k=='y'?str_pad($v,4,"0",STR_PAD_LEFT):str_pad($v,2,"0",STR_PAD_LEFT));
if($k=='y' || $k=='m'){$r.="-";}
elseif($k=='d'){$r.=" ";}
elseif($k=='h' || $k=='i'){$r.=":";}
},$details,array_keys($details)
);
echo "Valid format: ",$r; // now all components of datetime are properly padded
आउटपुट:
Raw Difference: 6 years 3 months 9 days 1 hours 0 minutes 6 seconds
Invalid format: 06-3-9 01:0:6
$detail array: array (
'y' => 6,
'm' => 3,
'd' => 9,
'h' => 1,
'i' => 0,
's' => 6,
)
Valid format: 0006-03-09 01:00:06
अब मेरी datetime मूल्य तैयारी समझाने के लिए:
$details
वें लेता है ई diff object और इसे एक सरणी के रूप में रखता है। array_flip(['y','m','d','h','i','s']) कुंजी की एक सरणी बनाता है जिसका उपयोग (array)$diff
से array_intersect_key() का उपयोग करके सभी अप्रासंगिक कुंजी को निकालने के लिए किया जाएगा।
फिर $details
में array_map() मेरी विधि दोहराता प्रत्येक मान और कुंजी का उपयोग कर, 0
के साथ उचित लंबाई के लिए अपनी बाईं ओर पैड, और आवश्यक विभाजक के साथ $r
(परिणाम) स्ट्रिंग का अनुरोध किया datetime प्रारूप के अनुरूप कोनकैटेनेट्स किया गया।
दिनांक() आपको स्ट्रिंग देता है। आप तारों के साथ मतभेदों की गणना नहीं कर सकते हैं। – Misch