Đây là những gì tôi đã có cho đến nay:Làm thế nào để tính toán sự khác biệt giữa hai ngày như một chuỗi định dạng?
/**
* Parse a duration between 2 date/times in seconds
* and to convert that duration into a formatted string
*
* @param integer $time_start start time in seconds
* @param integer $time_end end time in seconds
* @param string $format like the php strftime formatting uses %y %m %w %d %h or %i.
* @param boolean $chop chop off sections that have 0 values
*/
public static function FormatDateDiff($time_start = 0, $time_end = 0, $format = "%s", $chop = false) {
if($time_start > $time_end) list($time_start, $time_end) = array($time_end, $time_start);
list($year_start,$month_start,$day_start) = explode('-',date('Y-m-d',$time_start));
list($year_end,$month_end,$day_end) = explode('-',date('Y-m-d',$time_end));
$years = $year_end - $year_start;
$months = $month_end - $month_start;
$days = $day_start - $day_end;
$weeks = 0;
$hours = 0;
$mins = 0;
$secs = 0;
if(mktime(0,0,0,$month_end,$day_end) < mktime(0,0,0,$month_start,$day_start)) {
$years -= 1;
}
if($days < 0) {
$months -= 1;
$days += 30; // this is an approximation...not sure how to figure this out
}
if($months < 0) $months += 12;
if(strpos($format, '%y')===false) {
$months += $years * 12;
}
if(strpos($format, '%w')!==false) {
$weeks = floor($days/7);
$days %= 7;
}
echo date('Y-m-d',$time_start).' to '.date('Y-m-d',$time_end).": {$years}y {$months}m {$weeks}w {$days}d<br/>";
}
(Đó là chưa đầy đủ và không chính xác)
tôi dường như không thể có được toán đúng. Naively chia nó ra sẽ không hoạt động vì năm nhuận và độ dài khác nhau của tháng.
Logic cũng cần phải thay đổi tùy thuộc vào chuỗi định dạng. Ví dụ: thông qua 04-Feb-2010 đến 28-Jun-2011 (dưới dạng dấu thời gian unix) với chuỗi định dạng %y year %m month %d day
sẽ xuất ra 1 year 4 month 24 day
nhưng nếu bỏ qua %y year
thì cần phải thêm 12 tháng vào tháng, tức là, đầu ra phải là 16 month 24 day
.
Nên xử lý thời gian quá ... nhưng tôi chưa đến đó.
Không ai trong số những giải pháp xử lý date_difftuần. Và tôi không biết làm thế nào tôi có thể hack nó vào date_diff
, vì vậy đó không thực sự là một giải pháp cho tôi.
Hơn nữa, $diff->format
không làm những gì tôi đã yêu cầu ... để cung cấp tổng số tháng và ngày nếu "đơn vị lớn hơn" bị bỏ qua. Ví dụ:
>>> $start = new DateTime('04-Feb-2010')
>>> $end = new DateTime('28-Jun-2011')
>>> $diff = $start->diff($end)
>>> $diff->format('%m months, %d days')
'4 months, 24 days'
Nên là 16 months, 24 days
, như tôi đã nói trước đó. Vui lòng dừng quá nhanh để đóng câu hỏi của tôi như một bản dupe trước khi bạn hiểu nó đầy đủ. Nếu các giải pháp cho các câu hỏi khác có thể được tinh chỉnh để giải quyết điều này, tốt, nhưng hãy giải thích làm thế nào, bởi vì tôi không nhận được nó.
Để được rõ ràng,
- nếu
%y
được bỏ qua, năm nên được triển khai trong những tháng - nếu
%m
được bỏ qua, tháng nên được triển khai vào ngày - nếu
%w
được bỏ qua, tuần nên được cuộn vào các ngày - nếu bỏ qua
%h
, giờ phải được cuộn thành phút - nếu
%m
bị bỏ qua, phút phải được cuộn thành giây
Nếu "đơn vị nhỏ hơn" bị bỏ qua, đơn vị lớn nhất tiếp theo có thể được làm tròn hoặc trải sàn ở nơi có ý nghĩa.
Nếu bạn có PHP 5.3.0 hoặc cao hơn, điều này có thể giúp bạn: [DateInterval :: định dạng] (http://www.php.net/manual/en/dateinterval.format.php) – drew010
trùng lặp của [bài đăng này] (http: // stackoverflow.com/questions/676824/how-to-calculate-the-sự khác biệt-giữa-hai-ngày-sử dụng-php) – bowlerae
@ drew010: Không ... không xử lý hàng tuần. – mpen