আমার ফর্মটির দুটি তারিখ রয়েছে:
Start Date: 2007-03-24
End Date: 2009-06-26
এখন আমাকে নিম্নলিখিত ফর্মটিতে এই দুটিয়ের মধ্যে পার্থক্যটি সন্ধান করতে হবে:
2 years, 3 months and 2 days
আমি কীভাবে এই পিএইচপি করতে পারি?
আমার ফর্মটির দুটি তারিখ রয়েছে:
Start Date: 2007-03-24
End Date: 2009-06-26
এখন আমাকে নিম্নলিখিত ফর্মটিতে এই দুটিয়ের মধ্যে পার্থক্যটি সন্ধান করতে হবে:
2 years, 3 months and 2 days
আমি কীভাবে এই পিএইচপি করতে পারি?
উত্তর:
লিগ্যাসি কোডের জন্য এটি ব্যবহার করুন (পিএইচপি <5.3)। আপ টু ডেট সমাধানের জন্য নীচে জুরকার উত্তর দেখুন
আপনি দুটি তারিখকে ইউনিক্স সময়ে রূপান্তর করতে স্ট্রোটোটাইম () ব্যবহার করতে পারেন এবং তারপরে তাদের মধ্যে সেকেন্ডের সংখ্যা গণনা করতে পারেন। এ থেকে বিভিন্ন সময়কাল গণনা করা বরং সহজ।
$date1 = "2007-03-24";
$date2 = "2009-06-26";
$diff = abs(strtotime($date2) - strtotime($date1));
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
printf("%d years, %d months, %d days\n", $years, $months, $days);
সম্পাদনা করুন: অবশ্যই এটি করার পছন্দের উপায়টি নীচের জুরকা দ্বারা বর্ণিত মত। আমার কোডটি কেবলমাত্র তখনই প্রস্তাবিত হয় যদি আপনার পিএইচপি 5.3 বা তার চেয়ে ভাল না থাকে।
মন্তব্যে বেশিরভাগ লোক উল্লেখ করেছেন যে উপরের কোডটি কেবল একটি আনুমানিক। আমি এখনও বিশ্বাস করি যে বেশিরভাগ উদ্দেশ্যগুলির জন্য এটি ঠিক আছে, যেহেতু পরিসীমা ব্যবহারের ফলে নির্ভুলতা প্রদানের চেয়ে কতটা সময় কেটে গেছে বা এখনও থেকে যায় তার একটি ধারণা প্রদান করা - যদি আপনি এটি করতে চান তবে কেবল তারিখটি আউটপুট করুন।
এত কিছুর পরেও, আমি অভিযোগগুলি সমাধান করার সিদ্ধান্ত নিয়েছি। আপনার যদি সত্যই একটি সঠিক পরিসীমা প্রয়োজন তবে পিএইচপি 5.3 এ অ্যাক্সেস না পেয়ে থাকেন, নীচের কোডটি ব্যবহার করুন (এটি পিএইচপি 4 তেও কাজ করা উচিত)। এটি কোডের প্রত্যক্ষ পোর্ট যা পিএইচপি অভ্যন্তরীণভাবে রেঞ্জগুলি গণনা করতে ব্যবহার করে, ব্যতিক্রমটি যে এটি দিবালোকের সঞ্চয় সময় বিবেচনায় নেয় না। তার মানে এটি এক ঘন্টার মধ্যে সর্বাধিক বন্ধ হয়ে গেছে তবে এটি ব্যতীত এটি সঠিক হওয়া উচিত।
<?php
/**
* Calculate differences between two dates with precise semantics. Based on PHPs DateTime::diff()
* implementation by Derick Rethans. Ported to PHP by Emil H, 2011-05-02. No rights reserved.
*
* See here for original code:
* http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/tm2unixtime.c?revision=302890&view=markup
* http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/interval.c?revision=298973&view=markup
*/
function _date_range_limit($start, $end, $adj, $a, $b, $result)
{
if ($result[$a] < $start) {
$result[$b] -= intval(($start - $result[$a] - 1) / $adj) + 1;
$result[$a] += $adj * intval(($start - $result[$a] - 1) / $adj + 1);
}
if ($result[$a] >= $end) {
$result[$b] += intval($result[$a] / $adj);
$result[$a] -= $adj * intval($result[$a] / $adj);
}
return $result;
}
function _date_range_limit_days($base, $result)
{
$days_in_month_leap = array(31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$days_in_month = array(31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
_date_range_limit(1, 13, 12, "m", "y", &$base);
$year = $base["y"];
$month = $base["m"];
if (!$result["invert"]) {
while ($result["d"] < 0) {
$month--;
if ($month < 1) {
$month += 12;
$year--;
}
$leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
$days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];
$result["d"] += $days;
$result["m"]--;
}
} else {
while ($result["d"] < 0) {
$leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
$days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];
$result["d"] += $days;
$result["m"]--;
$month++;
if ($month > 12) {
$month -= 12;
$year++;
}
}
}
return $result;
}
function _date_normalize($base, $result)
{
$result = _date_range_limit(0, 60, 60, "s", "i", $result);
$result = _date_range_limit(0, 60, 60, "i", "h", $result);
$result = _date_range_limit(0, 24, 24, "h", "d", $result);
$result = _date_range_limit(0, 12, 12, "m", "y", $result);
$result = _date_range_limit_days(&$base, &$result);
$result = _date_range_limit(0, 12, 12, "m", "y", $result);
return $result;
}
/**
* Accepts two unix timestamps.
*/
function _date_diff($one, $two)
{
$invert = false;
if ($one > $two) {
list($one, $two) = array($two, $one);
$invert = true;
}
$key = array("y", "m", "d", "h", "i", "s");
$a = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $one))));
$b = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $two))));
$result = array();
$result["y"] = $b["y"] - $a["y"];
$result["m"] = $b["m"] - $a["m"];
$result["d"] = $b["d"] - $a["d"];
$result["h"] = $b["h"] - $a["h"];
$result["i"] = $b["i"] - $a["i"];
$result["s"] = $b["s"] - $a["s"];
$result["invert"] = $invert ? 1 : 0;
$result["days"] = intval(abs(($one - $two)/86400));
if ($invert) {
_date_normalize(&$a, &$result);
} else {
_date_normalize(&$b, &$result);
}
return $result;
}
$date = "1986-11-10 19:37:22";
print_r(_date_diff(strtotime($date), time()));
print_r(_date_diff(time(), strtotime($date)));
&
স্বাক্ষরে সরান ।
আমি ডেটটাইম এবং ডেটইন্টারওয়াল অবজেক্ট ব্যবহার করার পরামর্শ দিই।
$date1 = new DateTime("2007-03-24");
$date2 = new DateTime("2009-06-26");
$interval = $date1->diff($date2);
echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days ";
// shows the total amount of days (not divided into years, months and days like above)
echo "difference " . $interval->days . " days ";
আরও পড়ুন পিএইচপি ডেটটাইম :: বিভিন্ন ম্যানুয়াল
ম্যানুয়াল থেকে:
পিএইচপি 5.2.2 হিসাবে, ডেটটাইম অবজেক্টগুলি তুলনা অপারেটরগুলি ব্যবহার করে তুলনা করা যেতে পারে।
$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");
var_dump($date1 == $date2); // bool(false)
var_dump($date1 < $date2); // bool(true)
var_dump($date1 > $date2); // bool(false)
$date2->format('U') - $date1->format('U')
।
কর্মের সর্বোত্তম কোর্স হ'ল পিএইচপি'র DateTime
(এবং DateInterval
) অবজেক্ট ব্যবহার করা। প্রতিটি তারিখ একটি DateTime
বস্তুতে আবদ্ধ হয় , এবং তারপরে উভয়ের মধ্যে একটি পার্থক্য করা যেতে পারে:
$first_date = new DateTime("2012-11-30 17:03:30");
$second_date = new DateTime("2012-12-21 00:00:00");
DateTime
বস্তু গ্রহণ করবে কোনো বিন্যাসে strtotime()
would। যদি আরও নির্দিষ্ট তারিখের ফর্ম্যাট প্রয়োজন DateTime::createFromFormat()
হয় তবে DateTime
অবজেক্টটি তৈরি করতে ব্যবহার করা যেতে পারে ।
উভয় বস্তু তাত্ক্ষণিকভাবে চালিত হওয়ার পরে, আপনি অন্যটির সাথে একটিটির সাথে বিয়োগ করে DateTime::diff()
।
$difference = $first_date->diff($second_date);
$difference
DateInterval
পার্থক্য সম্পর্কিত তথ্য সহ এখন একটি বিষয় ধারণ করে । এর var_dump()
মতো দেখতে:
object(DateInterval)
public 'y' => int 0
public 'm' => int 0
public 'd' => int 20
public 'h' => int 6
public 'i' => int 56
public 's' => int 30
public 'invert' => int 0
public 'days' => int 20
DateInterval
অবজেক্টটি ফর্ম্যাট করতে আমাদের প্রতিটি মান পরীক্ষা করতে হবে এবং যদি 0 হয়:
/**
* Format an interval to show all existing components.
* If the interval doesn't have a time component (years, months, etc)
* That component won't be displayed.
*
* @param DateInterval $interval The interval
*
* @return string Formatted interval string.
*/
function format_interval(DateInterval $interval) {
$result = "";
if ($interval->y) { $result .= $interval->format("%y years "); }
if ($interval->m) { $result .= $interval->format("%m months "); }
if ($interval->d) { $result .= $interval->format("%d days "); }
if ($interval->h) { $result .= $interval->format("%h hours "); }
if ($interval->i) { $result .= $interval->format("%i minutes "); }
if ($interval->s) { $result .= $interval->format("%s seconds "); }
return $result;
}
এখন যা যা রয়েছে তা হ'ল আমাদের ফাংশনটি $difference
DateInterval
অবজেক্টটিতে কল করা :
echo format_interval($difference);
এবং আমরা সঠিক ফলাফল পেয়েছি:
20 দিন 6 ঘন্টা 56 মিনিট 30 সেকেন্ড
লক্ষ্য অর্জনে ব্যবহৃত সম্পূর্ণ কোড:
/**
* Format an interval to show all existing components.
* If the interval doesn't have a time component (years, months, etc)
* That component won't be displayed.
*
* @param DateInterval $interval The interval
*
* @return string Formatted interval string.
*/
function format_interval(DateInterval $interval) {
$result = "";
if ($interval->y) { $result .= $interval->format("%y years "); }
if ($interval->m) { $result .= $interval->format("%m months "); }
if ($interval->d) { $result .= $interval->format("%d days "); }
if ($interval->h) { $result .= $interval->format("%h hours "); }
if ($interval->i) { $result .= $interval->format("%i minutes "); }
if ($interval->s) { $result .= $interval->format("%s seconds "); }
return $result;
}
$first_date = new DateTime("2012-11-30 17:03:30");
$second_date = new DateTime("2012-12-21 00:00:00");
$difference = $first_date->diff($second_date);
echo format_interval($difference);
DateTime()
এটি কোনও ফাংশন নয়, এটি একটি অবজেক্ট এবং এটি পিএইচপি 5.2 থেকে রয়েছে। আপনার সার্ভার এটি সমর্থন করে তা নিশ্চিত করুন।
সময় এবং মিনিট এবং সেকেন্ড দেখুন ..
$date1 = "2008-11-01 22:45:00";
$date2 = "2009-12-04 13:44:01";
$diff = abs(strtotime($date2) - strtotime($date1));
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
$hours = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24)/ (60*60));
$minuts = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60)/ 60);
$seconds = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minuts*60));
printf("%d years, %d months, %d days, %d hours, %d minuts\n, %d seconds\n", $years, $months, $days, $hours, $minuts, $seconds);
নীচের লিঙ্কটি একবার দেখুন। এটি আমি এখনও অবধি খুঁজে পাওয়া সেরা উত্তর .. :)
function dateDiff ($d1, $d2) {
// Return the number of days between the two dates:
return round(abs(strtotime($d1) - strtotime($d2))/86400);
} // end function dateDiff
আপনি তারিখের প্যারামিটারগুলিতে পাস করার পরে কোন তারিখের আগের বা পরে তা গুরুত্বপূর্ণ নয়। দুটি তারিখের মধ্যে দিনের সংখ্যা হিসাবে সর্বদা একটি ইতিবাচক সংখ্যা ফেরত দিতে ফাংশনটি পিএইচপি এবিএস () নিরঙ্কুশ মানটি ব্যবহার করে।
মনে রাখবেন যে দুটি তারিখের মধ্যে দিনের সংখ্যা উভয় তারিখের অন্তর্ভুক্ত নয়। সুতরাং আপনি যদি প্রবেশের তারিখগুলির মধ্যে এবং সমস্ত তারিখগুলি সহ সমস্ত তারিখগুলি দ্বারা প্রতিনিধিত্ব করা দিনের সন্ধান করে থাকেন তবে আপনাকে এই ফাংশনের ফলাফলের জন্য একটি (1) যুক্ত করতে হবে।
উদাহরণস্বরূপ, 2013-02-09 এবং 2013-02-14 এর মধ্যে পার্থক্যটি (উপরের ফাংশন দ্বারা ফেরত হিসাবে) 5 হয় তবে 2013-02-09 - 2013-02- তারিখের সীমা দ্বারা প্রতিনিধিত্ব করা দিন বা তারিখের সংখ্যা is 14 হ'ল 6।
আমি এর পক্ষে ভোট দিয়েছি jurka এর উত্তর হিসাবে যে আমার প্রিয়, কিন্তু আমি একটি প্রি-php.5.3 সংস্করণ আছে ...
আমি নিজেকে একটি অনুরূপ সমস্যায় কাজ করতে দেখলাম - যা এই প্রশ্নটিতে আমি প্রথম স্থানে এসেছি - তবে কয়েক ঘন্টার মধ্যে কেবল একটি পার্থক্য প্রয়োজন। তবে আমার ফাংশনটি এটি খুব সুন্দরভাবে সমাধান করেছে এবং আমার নিজের লাইব্রেরিতে এটি কোথাও নেই যাতে এটি হারিয়ে যায় এবং ভুলে যায় না, তাই ... আশা করি এটি কারও পক্ষে কার্যকর।
/**
*
* @param DateTime $oDate1
* @param DateTime $oDate2
* @return array
*/
function date_diff_array(DateTime $oDate1, DateTime $oDate2) {
$aIntervals = array(
'year' => 0,
'month' => 0,
'week' => 0,
'day' => 0,
'hour' => 0,
'minute' => 0,
'second' => 0,
);
foreach($aIntervals as $sInterval => &$iInterval) {
while($oDate1 <= $oDate2){
$oDate1->modify('+1 ' . $sInterval);
if ($oDate1 > $oDate2) {
$oDate1->modify('-1 ' . $sInterval);
break;
} else {
$iInterval++;
}
}
}
return $aIntervals;
}
এবং পরীক্ষা:
$oDate = new DateTime();
$oDate->modify('+111402189 seconds');
var_dump($oDate);
var_dump(date_diff_array(new DateTime(), $oDate));
এবং ফলাফল:
object(DateTime)[2]
public 'date' => string '2014-04-29 18:52:51' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'America/New_York' (length=16)
array
'year' => int 3
'month' => int 6
'week' => int 1
'day' => int 4
'hour' => int 9
'minute' => int 3
'second' => int 8
আমি থেকে মূল ধারণা পেয়েছেন এখানে যা আমি আমার ব্যবহারের জন্য পরিবর্তন, (এবং আমি আশা করি আমার পরিমার্জন পাশাপাশি যে পৃষ্ঠাতে দেখাবেন হবে)।
$aIntervals
অ্যারে থেকে মুছে ফেলা বা " $aExclude
প্যারামিটার " যুক্ত করে আপনি খুব সহজেই ("সপ্তাহ" বলুন) চান না এমন অন্তরগুলি সরিয়ে ফেলতে পারেন বা স্ট্রিং আউটপুট করার সময় কেবল এগুলি ফিল্টার আউট করতে পারেন।
week
সূচকটি মুছে ফেলেন $aIntervals
(যেহেতু এটি DateDiff
কখনই ব্যবহার করে না)।
<?php
$today = strtotime("2011-02-03 00:00:00");
$myBirthDate = strtotime("1964-10-30 00:00:00");
printf("Days since my birthday: ", ($today - $myBirthDate)/60/60/24);
?>
আমি জানি না আপনি পিএইচপি কাঠামো ব্যবহার করছেন কি না, তবে পিএইচপি ফ্রেমওয়ার্কের অনেকগুলি তারিখ / সময় গ্রন্থাগার এবং হুইলারের সাহায্যে আপনাকে চক্রটি পুনরায় উদ্ভাবন থেকে বিরত রাখতে সহায়তা করে।
উদাহরণস্বরূপ CodeIgniter এর timespan()
ফাংশন রয়েছে। কেবল দুটি ইউনিক্স টাইমস্ট্যাম্প ইনপুট করুন এবং এটি স্বয়ংক্রিয়ভাবে এর ফলাফল তৈরি করবে:
1 Year, 10 Months, 2 Weeks, 5 Days, 10 Hours, 16 Minutes
echo time_diff_string('2013-05-01 00:22:35', 'now');
echo time_diff_string('2013-05-01 00:22:35', 'now', true);
4 months ago
4 months, 2 weeks, 3 days, 1 hour, 49 minutes, 15 seconds ago
function time_diff_string($from, $to, $full = false) {
$from = new DateTime($from);
$to = new DateTime($to);
$diff = $to->diff($from);
$diff->w = floor($diff->d / 7);
$diff->d -= $diff->w * 7;
$string = array(
'y' => 'year',
'm' => 'month',
'w' => 'week',
'd' => 'day',
'h' => 'hour',
'i' => 'minute',
's' => 'second',
);
foreach ($string as $k => &$v) {
if ($diff->$k) {
$v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
} else {
unset($string[$k]);
}
}
if (!$full) $string = array_slice($string, 0, 1);
return $string ? implode(', ', $string) . ' ago' : 'just now';
}
এর জন্য আমার কিছু সাধারণ যুক্তি রয়েছে:
<?php
per_days_diff('2011-12-12','2011-12-29')
function per_days_diff($start_date, $end_date) {
$per_days = 0;
$noOfWeek = 0;
$noOfWeekEnd = 0;
$highSeason=array("7", "8");
$current_date = strtotime($start_date);
$current_date += (24 * 3600);
$end_date = strtotime($end_date);
$seassion = (in_array(date('m', $current_date), $highSeason))?"2":"1";
$noOfdays = array('');
while ($current_date <= $end_date) {
if ($current_date <= $end_date) {
$date = date('N', $current_date);
array_push($noOfdays,$date);
$current_date = strtotime('+1 day', $current_date);
}
}
$finalDays = array_shift($noOfdays);
//print_r($noOfdays);
$weekFirst = array("week"=>array(),"weekEnd"=>array());
for($i = 0; $i < count($noOfdays); $i++)
{
if ($noOfdays[$i] == 1)
{
//echo "This is week";
//echo "<br/>";
if($noOfdays[$i+6]==7)
{
$noOfWeek++;
$i=$i+6;
}
else
{
$per_days++;
}
//array_push($weekFirst["week"],$day);
}
else if($noOfdays[$i]==5)
{
//echo "This is weekend";
//echo "<br/>";
if($noOfdays[$i+2] ==7)
{
$noOfWeekEnd++;
$i = $i+2;
}
else
{
$per_days++;
}
//echo "After weekend value:- ".$i;
//echo "<br/>";
}
else
{
$per_days++;
}
}
/*echo $noOfWeek;
echo "<br/>";
echo $noOfWeekEnd;
echo "<br/>";
print_r($per_days);
echo "<br/>";
print_r($weekFirst);
*/
$duration = array("weeks"=>$noOfWeek, "weekends"=>$noOfWeekEnd, "perDay"=>$per_days, "seassion"=>$seassion);
return $duration;
?>
আপনি ব্যবহার করতে পারেন
getdate()
ফাংশন যা সরবরাহ করা তারিখ / সময়ের সমস্ত উপাদানযুক্ত একটি অ্যারে প্রদান করে:
$diff = abs($endDate - $startDate);
$my_t=getdate($diff);
print("$my_t[year] years, $my_t[month] months and $my_t[mday] days");
যদি আপনার শুরু এবং শেষের তারিখগুলি স্ট্রিং ফর্ম্যাটে থাকে তবে ব্যবহার করুন
$startDate = strtotime($startDateStr);
$endDate = strtotime($endDateStr);
উপরের কোড আগে
$my_t["year"] -= 1970
বছরের সঠিক সংখ্যা পেতে আপনাকে একটি করা দরকার । ঘন্টা ঠিক করার জন্য আপনাকে GMT থেকে আপনার সময়ের পার্থক্য বিয়োগ করতে হবে। মাস এবং তারিখ থেকে আপনাকে 1 টি বিয়োগ করতে হবে।
// If you just want to see the year difference then use this function.
// Using the logic I've created you may also create month and day difference
// which I did not provide here so you may have the efforts to use your brain.
// :)
$date1='2009-01-01';
$date2='2010-01-01';
echo getYearDifference ($date1,$date2);
function getYearDifference($date1=strtotime($date1),$date2=strtotime($date2)){
$year = 0;
while($date2 > $date1 = strtotime('+1 year', $date1)){
++$year;
}
return $year;
}
এটি আমার কাজ। প্রয়োজনীয় পিএইচপি> = 5.3.4। এটি ডেটটাইম ক্লাস ব্যবহার করে। খুব দ্রুত, দ্রুত এবং দুটি তারিখ বা তথাকথিত "সময় থেকে" এর মধ্যে পার্থক্য করতে পারে।
if(function_exists('grk_Datetime_Since') === FALSE){
function grk_Datetime_Since($From, $To='', $Prefix='', $Suffix=' ago', $Words=array()){
# Est-ce qu'on calcul jusqu'à un moment précis ? Probablement pas, on utilise maintenant
if(empty($To) === TRUE){
$To = time();
}
# On va s'assurer que $From est numérique
if(is_int($From) === FALSE){
$From = strtotime($From);
};
# On va s'assurer que $To est numérique
if(is_int($To) === FALSE){
$To = strtotime($To);
}
# On a une erreur ?
if($From === FALSE OR $From === -1 OR $To === FALSE OR $To === -1){
return FALSE;
}
# On va créer deux objets de date
$From = new DateTime(@date('Y-m-d H:i:s', $From), new DateTimeZone('GMT'));
$To = new DateTime(@date('Y-m-d H:i:s', $To), new DateTimeZone('GMT'));
# On va calculer la différence entre $From et $To
if(($Diff = $From->diff($To)) === FALSE){
return FALSE;
}
# On va merger le tableau des noms (par défaut, anglais)
$Words = array_merge(array(
'year' => 'year',
'years' => 'years',
'month' => 'month',
'months' => 'months',
'week' => 'week',
'weeks' => 'weeks',
'day' => 'day',
'days' => 'days',
'hour' => 'hour',
'hours' => 'hours',
'minute' => 'minute',
'minutes' => 'minutes',
'second' => 'second',
'seconds' => 'seconds'
), $Words);
# On va créer la chaîne maintenant
if($Diff->y > 1){
$Text = $Diff->y.' '.$Words['years'];
} elseif($Diff->y == 1){
$Text = '1 '.$Words['year'];
} elseif($Diff->m > 1){
$Text = $Diff->m.' '.$Words['months'];
} elseif($Diff->m == 1){
$Text = '1 '.$Words['month'];
} elseif($Diff->d > 7){
$Text = ceil($Diff->d/7).' '.$Words['weeks'];
} elseif($Diff->d == 7){
$Text = '1 '.$Words['week'];
} elseif($Diff->d > 1){
$Text = $Diff->d.' '.$Words['days'];
} elseif($Diff->d == 1){
$Text = '1 '.$Words['day'];
} elseif($Diff->h > 1){
$Text = $Diff->h.' '.$Words['hours'];
} elseif($Diff->h == 1){
$Text = '1 '.$Words['hour'];
} elseif($Diff->i > 1){
$Text = $Diff->i.' '.$Words['minutes'];
} elseif($Diff->i == 1){
$Text = '1 '.$Words['minute'];
} elseif($Diff->s > 1){
$Text = $Diff->s.' '.$Words['seconds'];
} else {
$Text = '1 '.$Words['second'];
}
return $Prefix.$Text.$Suffix;
}
}
আমি ব্যবহার date_create
এবং date_diff
জিনিস পছন্দ করতে চাই ।
কোড:
$date1 = date_create("2007-03-24");
$date2 = date_create("2009-06-26");
$dateDifference = date_diff($date1, $date2)->format('%y years, %m months and %d days');
echo $dateDifference;
আউটপুট:
2 years, 3 months and 2 days
আরও তথ্যের জন্য পিএইচপি date_diff
ম্যানুয়াল পড়ুন
ম্যানুয়াল অনুসারে ডেটটাইম :: ডিফ ()
date_diff
এর একটি নাম
এটি টাইমস্ট্যাম্প দেওয়া হয়েছিল কিনা তা সনাক্ত করার চেষ্টা করবে এবং ভবিষ্যতের তারিখগুলি / সময়গুলি নেতিবাচক মান হিসাবে ফিরে আসবে:
<?php
function time_diff($start, $end = NULL, $convert_to_timestamp = FALSE) {
// If $convert_to_timestamp is not explicitly set to TRUE,
// check to see if it was accidental:
if ($convert_to_timestamp || !is_numeric($start)) {
// If $convert_to_timestamp is TRUE, convert to timestamp:
$timestamp_start = strtotime($start);
}
else {
// Otherwise, leave it as a timestamp:
$timestamp_start = $start;
}
// Same as above, but make sure $end has actually been overridden with a non-null,
// non-empty, non-numeric value:
if (!is_null($end) && (!empty($end) && !is_numeric($end))) {
$timestamp_end = strtotime($end);
}
else {
// If $end is NULL or empty and non-numeric value, assume the end time desired
// is the current time (useful for age, etc):
$timestamp_end = time();
}
// Regardless, set the start and end times to an integer:
$start_time = (int) $timestamp_start;
$end_time = (int) $timestamp_end;
// Assign these values as the params for $then and $now:
$start_time_var = 'start_time';
$end_time_var = 'end_time';
// Use this to determine if the output is positive (time passed) or negative (future):
$pos_neg = 1;
// If the end time is at a later time than the start time, do the opposite:
if ($end_time <= $start_time) {
$start_time_var = 'end_time';
$end_time_var = 'start_time';
$pos_neg = -1;
}
// Convert everything to the proper format, and do some math:
$then = new DateTime(date('Y-m-d H:i:s', $$start_time_var));
$now = new DateTime(date('Y-m-d H:i:s', $$end_time_var));
$years_then = $then->format('Y');
$years_now = $now->format('Y');
$years = $years_now - $years_then;
$months_then = $then->format('m');
$months_now = $now->format('m');
$months = $months_now - $months_then;
$days_then = $then->format('d');
$days_now = $now->format('d');
$days = $days_now - $days_then;
$hours_then = $then->format('H');
$hours_now = $now->format('H');
$hours = $hours_now - $hours_then;
$minutes_then = $then->format('i');
$minutes_now = $now->format('i');
$minutes = $minutes_now - $minutes_then;
$seconds_then = $then->format('s');
$seconds_now = $now->format('s');
$seconds = $seconds_now - $seconds_then;
if ($seconds < 0) {
$minutes -= 1;
$seconds += 60;
}
if ($minutes < 0) {
$hours -= 1;
$minutes += 60;
}
if ($hours < 0) {
$days -= 1;
$hours += 24;
}
$months_last = $months_now - 1;
if ($months_now == 1) {
$years_now -= 1;
$months_last = 12;
}
// "Thirty days hath September, April, June, and November" ;)
if ($months_last == 9 || $months_last == 4 || $months_last == 6 || $months_last == 11) {
$days_last_month = 30;
}
else if ($months_last == 2) {
// Factor in leap years:
if (($years_now % 4) == 0) {
$days_last_month = 29;
}
else {
$days_last_month = 28;
}
}
else {
$days_last_month = 31;
}
if ($days < 0) {
$months -= 1;
$days += $days_last_month;
}
if ($months < 0) {
$years -= 1;
$months += 12;
}
// Finally, multiply each value by either 1 (in which case it will stay the same),
// or by -1 (in which case it will become negative, for future dates).
// Note: 0 * 1 == 0 * -1 == 0
$out = new stdClass;
$out->years = (int) $years * $pos_neg;
$out->months = (int) $months * $pos_neg;
$out->days = (int) $days * $pos_neg;
$out->hours = (int) $hours * $pos_neg;
$out->minutes = (int) $minutes * $pos_neg;
$out->seconds = (int) $seconds * $pos_neg;
return $out;
}
ব্যবহারের উদাহরণ:
<?php
$birthday = 'June 2, 1971';
$check_age_for_this_date = 'June 3, 1999 8:53pm';
$age = time_diff($birthday, $check_age_for_this_date)->years;
print $age;// 28
বা:
<?php
$christmas_2020 = 'December 25, 2020';
$countdown = time_diff($christmas_2020);
print_r($countdown);
"যদি" তারিখটি মাইএসকিউএলতে সঞ্চিত থাকে, তবে আমি ডাটাবেস স্তরে পার্থক্য গণনা করা আরও সহজ মনে করি ... তারপরে দিবস, আওয়ার, মিনিট, সেক আউটপুট, পার্স এবং ডিসপ্লে ফলাফলের উপর ভিত্তি করে যথাযথ ...
mysql> select firstName, convert_tz(loginDate, '+00:00', '-04:00') as loginDate, TIMESTAMPDIFF(DAY, loginDate, now()) as 'Day', TIMESTAMPDIFF(HOUR, loginDate, now())+4 as 'Hour', TIMESTAMPDIFF(MINUTE, loginDate, now())+(60*4) as 'Min', TIMESTAMPDIFF(SECOND, loginDate, now())+(60*60*4) as 'Sec' from User_ where userId != '10158' AND userId != '10198' group by emailAddress order by loginDate desc;
+-----------+---------------------+------+------+------+--------+
| firstName | loginDate | Day | Hour | Min | Sec |
+-----------+---------------------+------+------+------+--------+
| Peter | 2014-03-30 18:54:40 | 0 | 4 | 244 | 14644 |
| Keith | 2014-03-30 18:54:11 | 0 | 4 | 244 | 14673 |
| Andres | 2014-03-28 09:20:10 | 2 | 61 | 3698 | 221914 |
| Nadeem | 2014-03-26 09:33:43 | 4 | 109 | 6565 | 393901 |
+-----------+---------------------+------+------+------+--------+
4 rows in set (0.00 sec)
আমি নীচের পৃষ্ঠায় আপনার নিবন্ধটি পেয়েছি, যা পিএইচপি তারিখের সময় গণনার জন্য অনেকগুলি উল্লেখ রয়েছে ।
পিএইচপি ব্যবহার করে দুটি তারিখের (এবং সময়) মধ্যে পার্থক্য গণনা করুন। নিম্নলিখিত পৃষ্ঠায় পিএইচপি ব্যবহার করে তারিখ / সময় গণনা সম্পাদনের জন্য সময় (ঘন্টা, মুনাইট), দিন, মাস বা দুই তারিখের মধ্যে বছরের পার্থক্য নির্ধারণের জন্য বিভিন্ন পদ্ধতি (মোট 7 টি) সরবরাহ করে।
পিএইচপি তারিখের সময় - 2 তারিখের মধ্যে পার্থক্য গণনা করার জন্য 7 টি পদ্ধতি দেখুন ।
আপনি $ তারিখ 1 = ued তারিখের চেয়ে বেশি রাউন্ড ভগ্নাংশ দ্বারা তারিখের পার্থক্য ফেরত দিতে নিম্নলিখিত কোডগুলি ব্যবহার করতে পারেন; // নির্ধারিত তারিখ প্রতিধ্বনি $ তারিখ 2 = তারিখ ("ওয়াইএমডি"); // বর্তমান তারিখ s ts1 = স্ট্রোটোটাইম ($ তারিখ 1); s ts2 = স্ট্রোটোটাইম ($ তারিখ 2); $ সেকেন্ড_ডিফ = $ টিএস 1 - $ টিএস 2; প্রতিধ্বনি $ ডেটেডিফ = সিল (($ সেকেন্ড_ডিফ / 3600) / 24); // দিন ফিরে
আপনি সিলের পরিবর্তে পিএইচপি এর মেঝে পদ্ধতি ব্যবহার করলে এটি আপনাকে গোলাকার ভগ্নাংশটি নীচে ফিরিয়ে আনবে। দয়া করে এখানে পার্থক্যটি পরীক্ষা করুন, কিছু সময় যদি আপনার স্টেজিং সার্ভারের সময় অঞ্চল আলাদা হয় তবে লাইভ সাইটের সময় অঞ্চল সেই ক্ষেত্রে আপনি বিভিন্ন ফলাফল পেতে পারেন তাই শর্ত অনুসারে পরিবর্তন করুন।
আপনি সর্বদা নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন যা বছর এবং মাসগুলিতে বয়স ফিরিয়ে দিতে পারে (যেমন 1 বছর 4 মাস)
function getAge($dob, $age_at_date)
{
$d1 = new DateTime($dob);
$d2 = new DateTime($age_at_date);
$age = $d2->diff($d1);
$years = $age->y;
$months = $age->m;
return $years.'.'.months;
}
বা আপনি যদি বর্তমান তারিখে বয়স গণনা করতে চান তবে আপনি এটি ব্যবহার করতে পারেন
function getAge($dob)
{
$d1 = new DateTime($dob);
$d2 = new DateTime(date());
$age = $d2->diff($d1);
$years = $age->y;
$months = $age->m;
return $years.'.'.months;
}
পিএইচপি সংস্করণ> = 5.3 এর জন্য: দুটি তারিখ অবজেক্ট তৈরি করুন এবং তারপরে date_diff()
ফাংশনটি ব্যবহার করুন। এটি পিএইচপি ডেটইন্টারওয়াল অবজেক্টটি ফিরিয়ে দেবে । ডকুমেন্টেশন দেখুন
$date1=date_create("2007-03-24");
$date2=date_create("2009-06-26");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
আমার পিএইচপি 5.2 এর একই সমস্যা ছিল এবং এটি মাইএসকিউএল দিয়ে সমাধান করেছে। আপনি যা খুঁজছেন ঠিক তেমনটি নাও হতে পারে তবে এটি কৌশলটি করবে এবং দিনের সংখ্যা ফিরিয়ে দেবে:
$datediff_q = $dbh->prepare("SELECT DATEDIFF(:date2, :date1)");
$datediff_q->bindValue(':date1', '2007-03-24', PDO::PARAM_STR);
$datediff_q->bindValue(':date2', '2009-06-26', PDO::PARAM_STR);
$datediff = ($datediff_q->execute()) ? $datediff_q->fetchColumn(0) : false;
এখানে আরো তথ্য http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff
যেহেতু প্রত্যেকে কোডের নমুনাগুলি পোস্ট করছে, তাই এখানে অন্য সংস্করণ।
আমি সেকেন্ড থেকে বছরের মধ্যে পার্থক্য প্রদর্শন করার জন্য একটি ফাংশন চেয়েছিলাম (মাত্র একটি ইউনিট)। 1 দিনেরও বেশি সময়ের জন্য, আমি এটি মধ্যরাতে রোলওভার করতে চেয়েছিলাম (বুধবার সকাল 9 টা থেকে বুধবার সকাল 10 টা দেখা গেছে 2 দিন আগে, 1 নয়)। এবং এক মাস ধরে পিরিয়ডের জন্য, আমি চেয়েছিলাম যে রোলওভারটি মাসের একই দিনে (30/31 দিনের মাস এবং লিপ বছর সহ) অন্তর্ভুক্ত থাকে।
এটিই আমি নিয়ে এসেছি:
/**
* Returns how long ago something happened in the past, showing it
* as n seconds / minutes / hours / days / weeks / months / years ago.
*
* For periods over a day, it rolls over at midnight (so doesn't depend
* on current time of day), and it correctly accounts for month-lengths
* and leap-years (months and years rollover on current day of month).
*
* $param string $timestamp in DateTime format
* $return string description of interval
*/
function ago($timestamp)
{
$then = date_create($timestamp);
// for anything over 1 day, make it rollover on midnight
$today = date_create('tomorrow'); // ie end of today
$diff = date_diff($then, $today);
if ($diff->y > 0) return $diff->y.' year'.($diff->y>1?'s':'').' ago';
if ($diff->m > 0) return $diff->m.' month'.($diff->m>1?'s':'').' ago';
$diffW = floor($diff->d / 7);
if ($diffW > 0) return $diffW.' week'.($diffW>1?'s':'').' ago';
if ($diff->d > 1) return $diff->d.' day'.($diff->d>1?'s':'').' ago';
// for anything less than 1 day, base it off 'now'
$now = date_create();
$diff = date_diff($then, $now);
if ($diff->d > 0) return 'yesterday';
if ($diff->h > 0) return $diff->h.' hour'.($diff->h>1?'s':'').' ago';
if ($diff->i > 0) return $diff->i.' minute'.($diff->i>1?'s':'').' ago';
return $diff->s.' second'.($diff->s==1?'':'s').' ago';
}
কিছু সময় আগে আমি একটি format_date
ফাংশন লিখেছিলাম কারণ এটি আপনাকে কীভাবে আপনার তারিখটি চায় তার অনেকগুলি বিকল্প দেয় :
function format_date($date, $type, $seperator="-")
{
if($date)
{
$day = date("j", strtotime($date));
$month = date("n", strtotime($date));
$year = date("Y", strtotime($date));
$hour = date("H", strtotime($date));
$min = date("i", strtotime($date));
$sec = date("s", strtotime($date));
switch($type)
{
case 0: $date = date("Y".$seperator."m".$seperator."d",mktime($hour, $min, $sec, $month, $day, $year)); break;
case 1: $date = date("D, F j, Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
case 2: $date = date("d".$seperator."m".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
case 3: $date = date("d".$seperator."M".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
case 4: $date = date("d".$seperator."M".$seperator."Y h:i A",mktime($hour, $min, $sec, $month, $day, $year)); break;
case 5: $date = date("m".$seperator."d".$seperator."Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
case 6: $date = date("M",mktime($hour, $min, $sec, $month, $day, $year)); break;
case 7: $date = date("Y",mktime($hour, $min, $sec, $month, $day, $year)); break;
case 8: $date = date("j",mktime($hour, $min, $sec, $month, $day, $year)); break;
case 9: $date = date("n",mktime($hour, $min, $sec, $month, $day, $year)); break;
case 10:
$diff = abs(strtotime($date) - strtotime(date("Y-m-d h:i:s")));
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
$date = $years . " years, " . $months . " months, " . $days . "days";
}
}
return($date);
}
খুব সহজ:
<?php
$date1 = date_create("2007-03-24");
echo "Start date: ".$date1->format("Y-m-d")."<br>";
$date2 = date_create("2009-06-26");
echo "End date: ".$date2->format("Y-m-d")."<br>";
$diff = date_diff($date1,$date2);
echo "Difference between start date and end date: ".$diff->format("%y years, %m months and %d days")."<br>";
?>
বিস্তারিত জানার জন্য নীচের লিঙ্কটি চেকআউট করুন:
পিএইচপি: তারিখ_ডিফ - ম্যানুয়াল
মনে রাখবেন এটি পিএইচপি 5.3.0 বা তারও বেশি এর জন্য।
একটি সহজ ফাংশন
function time_difference($time_1, $time_2, $limit = null)
{
$val_1 = new DateTime($time_1);
$val_2 = new DateTime($time_2);
$interval = $val_1->diff($val_2);
$output = array(
"year" => $interval->y,
"month" => $interval->m,
"day" => $interval->d,
"hour" => $interval->h,
"minute" => $interval->i,
"second" => $interval->s
);
$return = "";
foreach ($output AS $key => $value) {
if ($value == 1)
$return .= $value . " " . $key . " ";
elseif ($value >= 1)
$return .= $value . " " . $key . "s ";
if ($key == $limit)
return trim($return);
}
return trim($return);
}
মত ব্যবহার করুন
echo time_difference ($time_1, $time_2, "day");
মত ফিরে আসবে 2 years 8 months 2 days
ডেট_ডিফ () ব্যবহার করে খুব সাধারণ উত্তরটি ব্যবহার করে দেখুন , এটি পরীক্ষা করা হয়েছে।
$date1 = date_create("2017-11-27");
$date2 = date_create("2018-12-29");
$diff=date_diff($date1,$date2);
$months = $diff->format("%m months");
$years = $diff->format("%y years");
$days = $diff->format("%d days");
echo $years .' '.$months.' '.$days;
আউটপুটটি হ'ল:
1 years 1 months 2 days
আমি নিম্নলিখিত ফাংশনটি ব্যবহার করছি যা আমি লিখেছিলাম, যখন পিএইচপি 5.3 (যথাক্রমে ডেট_ডিফ ()) পাওয়া যায় না:
function dateDifference($startDate, $endDate)
{
$startDate = strtotime($startDate);
$endDate = strtotime($endDate);
if ($startDate === false || $startDate < 0 || $endDate === false || $endDate < 0 || $startDate > $endDate)
return false;
$years = date('Y', $endDate) - date('Y', $startDate);
$endMonth = date('m', $endDate);
$startMonth = date('m', $startDate);
// Calculate months
$months = $endMonth - $startMonth;
if ($months <= 0) {
$months += 12;
$years--;
}
if ($years < 0)
return false;
// Calculate the days
$measure = ($months == 1) ? 'month' : 'months';
$days = $endDate - strtotime('+' . $months . ' ' . $measure, $startDate);
$days = date('z', $days);
return array($years, $months, $days);
}
DateInterval
দুর্দান্ত তবে এটিতে বেশ কয়েকটা সতর্কতা রয়েছে:
এ থেকে উত্তরণের জন্য, আমি নিম্নলিখিতগুলি কোড করেছিলাম ( @ এনবোরেভ উত্তর থেকে উন্নত ):
function date_dif($since, $until, $keys = 'year|month|week|day|hour|minute|second')
{
$date = array_map('strtotime', array($since, $until));
if ((count($date = array_filter($date, 'is_int')) == 2) && (sort($date) === true))
{
$result = array_fill_keys(explode('|', $keys), 0);
foreach (preg_grep('~^(?:year|month)~i', $result) as $key => $value)
{
while ($date[1] >= strtotime(sprintf('+%u %s', $value + 1, $key), $date[0]))
{
++$value;
}
$date[0] = strtotime(sprintf('+%u %s', $result[$key] = $value, $key), $date[0]);
}
foreach (preg_grep('~^(?:year|month)~i', $result, PREG_GREP_INVERT) as $key => $value)
{
if (($value = intval(abs($date[0] - $date[1]) / strtotime(sprintf('%u %s', 1, $key), 0))) > 0)
{
$date[0] = strtotime(sprintf('+%u %s', $result[$key] = $value, $key), $date[0]);
}
}
return $result;
}
return false;
}
এটি দুটি লুপ চালায়; প্রথমটি ব্রুট-ফোর্সিংয়ের মাধ্যমে আপেক্ষিক বিরতির (বছর এবং মাস) এর সাথে আলোচনা করে এবং দ্বিতীয়টি অতিরিক্ত গাণিতিক ব্যবধানগুলি সাধারণ গাণিতিকের সাথে গণনা করে (সুতরাং এটি দ্রুত):
echo humanize(date_dif('2007-03-24', '2009-07-31', 'second')); // 74300400 seconds
echo humanize(date_dif('2007-03-24', '2009-07-31', 'minute|second')); // 1238400 minutes, 0 seconds
echo humanize(date_dif('2007-03-24', '2009-07-31', 'hour|minute|second')); // 20640 hours, 0 minutes, 0 seconds
echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|day')); // 2 years, 129 days
echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|week')); // 2 years, 18 weeks
echo humanize(date_dif('2007-03-24', '2009-07-31', 'year|week|day')); // 2 years, 18 weeks, 3 days
echo humanize(date_dif('2007-03-24', '2009-07-31')); // 2 years, 4 months, 1 week, 0 days, 0 hours, 0 minutes, 0 seconds
function humanize($array)
{
$result = array();
foreach ($array as $key => $value)
{
$result[$key] = $value . ' ' . $key;
if ($value != 1)
{
$result[$key] .= 's';
}
}
return implode(', ', $result);
}