【问题标题】:What is the correct way to calculate no of days between two dates in laravel在laravel中计算两个日期之间的天数的正确方法是什么
【发布时间】:2020-03-21 10:50:18
【问题描述】:

我目前正在处理尼泊尔日期。由于月末没有简单的逻辑,它可以是 29、30、31 和 32。在特定逻辑中,我不需要两个日期之间的天数。

我尝试了以下代码:

    $from = '2076-07-15';
    $to = '2076-07-30';

    $from_array = explode('-', $from);
    $to_array = explode('-', $to);

    $days = $to_array[2] - $from_array[2];

这给出的天数为 15,但在以下情况下是正确的,

$from  = '2076-07-01';
$to = '2076-07-15';

输出将是 14,但我想要的输出是 15,因为从 1 到 15 有 15 天。

我想要的示例输出是:

From       To            Required  Current

2076-07-01 2076-07-15 => 15 days   14 days -----> Incorrect
2076-07-15 2076-07-30 => 15 days   15 days ------> Correct
2076-07-01 2076-07-30 => 30 days   29 days ------> Incorrect

有什么办法可以做到吗?

注意:from和to变量的年月值相同,只有day字段不同

【问题讨论】:

  • laravel?只使用Carbon,或者只使用DateTime 类,不要使用诸如explode 之类的字符串操作
  • @Kevin 我不能使用 Carbon,因为我在尼泊尔使用当地日期,这不是英文日期,有些月份可能有 32 天
  • 那你需要把它转换成英文日期并使用碳没有其他办法兄弟。我也是尼泊尔人。
  • 这个呢? stackoverflow.com/a/21552708/3859027 这使用尼泊尔语格式与Carbon/DateTime
  • 抱歉,“输出将是 14,但我想要的输出是 15,因为从 1 到 15 有 15 天。”但是根据您的输出: 2076-07-15 2076-07-30 => 15 days 15 days ------> 正确 应该也是错的,因为从 15 到 30 有 16 天

标签: php laravel date


【解决方案1】:

最简单的方法是使用nesbot/carbonhttps://carbon.nesbot.com/#gettingstarted

use Carbon\Carbon;

$from = Carbon::parse('2076-07-15');
$to = Carbon::parse('2076-07-30');
$days = $from->diffInDays($to);

【讨论】:

    【解决方案2】:

    试试

     $datetime1 = new DateTime("05-07-2019");
     $datetime2 = new DateTime("10-08-2021");
     $difference = $datetime1->diff($datetime2);
     echo 'Difference: '.$difference->y.' years, ' 
               .$difference->m.' months, ' 
               .$difference->d.' days';
    

    它会给出一个输出

    Difference: 2 years, 1 months, 5 days
    

    如果你只想要天的差异。使用

    echo 'Difference: '.$difference->format('%a').' Days';
    

    输出将是

    Difference: 767 Days
    

    【讨论】:

      【解决方案3】:

      将此代码复制并粘贴到您可以访问的某个位置,然后使用提供的最后一个示例方法。这会将尼泊尔语转换成英语,反之亦然。然后用 Carbon 减去日期。

      Nepali into english and vice versa converter
      
      <?php
      namespace App\Helper;
      
      class Nepali_Calendar
      {
          // Data for nepali date
          private $_bs = array(
              0 => array(2000,30,32,31,32,31,30,30,30,29,30,29,31),
              1 => array(2001,31,31,32,31,31,31,30,29,30,29,30,30),
              2 => array(2002,31,31,32,32,31,30,30,29,30,29,30,30),
              3 => array(2003,31,32,31,32,31,30,30,30,29,29,30,31),
              4 => array(2004,30,32,31,32,31,30,30,30,29,30,29,31),
              5 => array(2005,31,31,32,31,31,31,30,29,30,29,30,30),
              6 => array(2006,31,31,32,32,31,30,30,29,30,29,30,30),
              7 => array(2007,31,32,31,32,31,30,30,30,29,29,30,31),
              8 => array(2008,31,31,31,32,31,31,29,30,30,29,29,31),
              9 => array(2009,31,31,32,31,31,31,30,29,30,29,30,30),
              10 => array(2010,31,31,32,32,31,30,30,29,30,29,30,30),
              11 => array(2011,31,32,31,32,31,30,30,30,29,29,30,31),
              12 => array(2012,31,31,31,32,31,31,29,30,30,29,30,30),
              13 => array(2013,31,31,32,31,31,31,30,29,30,29,30,30),
              14 => array(2014,31,31,32,32,31,30,30,29,30,29,30,30),
              15 => array(2015,31,32,31,32,31,30,30,30,29,29,30,31),
              16 => array(2016,31,31,31,32,31,31,29,30,30,29,30,30),
              17 => array(2017,31,31,32,31,31,31,30,29,30,29,30,30),
              18 => array(2018,31,32,31,32,31,30,30,29,30,29,30,30),
              19 => array(2019,31,32,31,32,31,30,30,30,29,30,29,31),
              20 => array(2020,31,31,31,32,31,31,30,29,30,29,30,30),
              21 => array(2021,31,31,32,31,31,31,30,29,30,29,30,30),
              22 => array(2022,31,32,31,32,31,30,30,30,29,29,30,30),
              23 => array(2023,31,32,31,32,31,30,30,30,29,30,29,31),
              24 => array(2024,31,31,31,32,31,31,30,29,30,29,30,30),
              25 => array(2025,31,31,32,31,31,31,30,29,30,29,30,30),
              26 => array(2026,31,32,31,32,31,30,30,30,29,29,30,31),
              27 => array(2027,30,32,31,32,31,30,30,30,29,30,29,31),
              28 => array(2028,31,31,32,31,31,31,30,29,30,29,30,30),
              29 => array(2029,31,31,32,31,32,30,30,29,30,29,30,30),
              30 => array(2030,31,32,31,32,31,30,30,30,29,29,30,31),
              31 => array(2031,30,32,31,32,31,30,30,30,29,30,29,31),
              32 => array(2032,31,31,32,31,31,31,30,29,30,29,30,30),
              33 => array(2033,31,31,32,32,31,30,30,29,30,29,30,30),
              34 => array(2034,31,32,31,32,31,30,30,30,29,29,30,31),
              35 => array(2035,30,32,31,32,31,31,29,30,30,29,29,31),
              36 => array(2036,31,31,32,31,31,31,30,29,30,29,30,30),
              37 => array(2037,31,31,32,32,31,30,30,29,30,29,30,30),
              38 => array(2038,31,32,31,32,31,30,30,30,29,29,30,31),
              39 => array(2039,31,31,31,32,31,31,29,30,30,29,30,30),
              40 => array(2040,31,31,32,31,31,31,30,29,30,29,30,30),
              41 => array(2041,31,31,32,32,31,30,30,29,30,29,30,30),
              42 => array(2042,31,32,31,32,31,30,30,30,29,29,30,31),
              43 => array(2043,31,31,31,32,31,31,29,30,30,29,30,30),
              44 => array(2044,31,31,32,31,31,31,30,29,30,29,30,30),
              45 => array(2045,31,32,31,32,31,30,30,29,30,29,30,30),
              46 => array(2046,31,32,31,32,31,30,30,30,29,29,30,31),
              47 => array(2047,31,31,31,32,31,31,30,29,30,29,30,30),
              48 => array(2048,31,31,32,31,31,31,30,29,30,29,30,30),
              49 => array(2049,31,32,31,32,31,30,30,30,29,29,30,30),
              50 => array(2050,31,32,31,32,31,30,30,30,29,30,29,31),
              51 => array(2051,31,31,31,32,31,31,30,29,30,29,30,30),
              52 => array(2052,31,31,32,31,31,31,30,29,30,29,30,30),
              53 => array(2053,31,32,31,32,31,30,30,30,29,29,30,30),
              54 => array(2054,31,32,31,32,31,30,30,30,29,30,29,31),
              55 => array(2055,31,31,32,31,31,31,30,29,30,29,30,30),
              56 => array(2056,31,31,32,31,32,30,30,29,30,29,30,30),
              57 => array(2057,31,32,31,32,31,30,30,30,29,29,30,31),
              58 => array(2058,30,32,31,32,31,30,30,30,29,30,29,31),
              59 => array(2059,31,31,32,31,31,31,30,29,30,29,30,30),
              60 => array(2060,31,31,32,32,31,30,30,29,30,29,30,30),
              61 => array(2061,31,32,31,32,31,30,30,30,29,29,30,31),
              62 => array(2062,30,32,31,32,31,31,29,30,29,30,29,31),
              63 => array(2063,31,31,32,31,31,31,30,29,30,29,30,30),
              64 => array(2064,31,31,32,32,31,30,30,29,30,29,30,30),
              65 => array(2065,31,32,31,32,31,30,30,30,29,29,30,31),
              66 => array(2066,31,31,31,32,31,31,29,30,30,29,29,31),
              67 => array(2067,31,31,32,31,31,31,30,29,30,29,30,30),
              68 => array(2068,31,31,32,32,31,30,30,29,30,29,30,30),
              69 => array(2069,31,32,31,32,31,30,30,30,29,29,30,31),
              70 => array(2070,31,31,31,32,31,31,29,30,30,29,30,30),
              71 => array(2071,31,31,32,31,31,31,30,29,30,29,30,30),
              72 => array(2072,31,32,31,32,31,30,30,29,30,29,30,30),
              73 => array(2073,31,32,31,32,31,30,30,30,29,29,30,31),
              74 => array(2074,31,31,31,32,31,31,30,29,30,29,30,30),
              75 => array(2075,31,31,32,31,31,31,30,29,30,29,30,30),
              76 => array(2076,31,32,31,32,31,30,30,30,29,29,30,30),
              77 => array(2077,31,32,31,32,31,30,30,30,29,30,29,31),
              78 => array(2078,31,31,31,32,31,31,30,29,30,29,30,30),
              79 => array(2079,31,31,32,31,31,31,30,29,30,29,30,30),
              80 => array(2080,31,32,31,32,31,30,30,30,29,29,30,30),
              81 => array(2081,31,31,32,32,31,30,30,30,29,30,30,30),
              82 => array(2082,30,32,31,32,31,30,30,30,29,30,30,30),
              83 => array(2083,31,31,32,31,31,30,30,30,29,30,30,30),
              84 => array(2084,31,31,32,31,31,30,30,30,29,30,30,30),
              85 => array(2085,31,32,31,32,30,31,30,30,29,30,30,30),
              86 => array(2086,30,32,31,32,31,30,30,30,29,30,30,30),
              87 => array(2087,31,31,32,31,31,31,30,30,29,30,30,30),
              88 => array(2088,30,31,32,32,30,31,30,30,29,30,30,30),
              89 => array(2089,30,32,31,32,31,30,30,30,29,30,30,30),
              90 => array(2090,30,32,31,32,31,30,30,30,29,30,30,30)
          );
      
          private $_nep_date = array('year' => '', 'month' => '', 'date' => '', 'day' => '', 'nmonth' => '', 'num_day' => '');
      
          private $_eng_date = array('year' => '', 'month' => '', 'date' => '', 'day' => '', 'emonth' => '', 'num_day' => '');
      
          public $debug_info = "";
      
          /**
           * Return day
           *
           * @param int $day
           * @return string
           */
          private function _get_day_of_week($day)
          {
              switch ($day)
              {
                  case 1:
                      $day = "Sunday";
                      break;
      
                  case 2:
                      $day = "Monday";
                      break;
      
                  case 3:
                      $day = "Tuesday";
                      break;
      
                  case 4:
                      $day = "Wednesday";
                      break;
      
                  case 5:
                      $day = "Thursday";
                      break;
      
                  case 6:
                      $day = "Friday";
                      break;
      
                  case 7:
                      $day = "Saturday";
                      break;
              }
              return $day;
          }
      
          /**
           * Return english month name
           *
           * @param int $m
           * @return string
           */
          private function _get_english_month($m)
          {
              $eMonth = FALSE;
              switch ($m)
              {
                  case 1:
                      $eMonth = "January";
                      break;
                  case 2:
                      $eMonth = "February";
                      break;
                  case 3:
                      $eMonth = "March";
                      break;
                  case 4:
                      $eMonth = "April";
                      break;
                  case 5:
                      $eMonth = "May";
                      break;
                  case 6:
                      $eMonth = "June";
                      break;
                  case 7:
                      $eMonth = "July";
                      break;
                  case 8:
                      $eMonth = "August";
                      break;
                  case 9:
                      $eMonth = "September";
                      break;
                  case 10:
                      $eMonth = "October";
                      break;
                  case 11:
                      $eMonth = "November";
                      break;
                  case 12:
                      $eMonth = "December";
              }
              return $eMonth;
          }
      
          /**
           * Return nepali month name
           *
           * @param int $m
           * @return string
           */
          private function _get_nepali_month($m)
          {
              $n_month = FALSE;
      
              switch ($m)
              {
                  case 1:
                      $n_month = "Baishak";
                      break;
      
                  case 2:
                      $n_month = "Jestha";
                      break;
      
                  case 3:
                      $n_month = "Ashad";
                      break;
      
                  case 4:
                      $n_month = "Shrawn";
                      break;
      
                  case 5:
                      $n_month = "Bhadra";
                      break;
      
                  case 6:
                      $n_month = "Ashwin";
                      break;
      
                  case 7:
                      $n_month = "kartik";
                      break;
      
                  case 8:
                      $n_month = "Mangshir";
                      break;
      
                  case 9:
                      $n_month = "Poush";
                      break;
      
                  case 10:
                      $n_month = "Magh";
                      break;
      
                  case 11:
                      $n_month = "Falgun";
                      break;
      
                  case 12:
                      $n_month = "Chaitra";
                      break;
              }
              return $n_month;
          }
      
          /**
           * Check if date range is in english
           *
           * @param int $yy
           * @param int $mm
           * @param int $dd
           * @return bool
           */
          private function _is_in_range_eng($yy, $mm, $dd)
          {
              if ($yy < 1944 || $yy > 2033)
              {
                  return 'Supported only between 1944-2022';
              }
      
              if ($mm < 1 || $mm > 12)
              {
                  return 'Error! month value can be between 1-12 only';
              }
      
              if ($dd < 1 || $dd > 31)
              {
                  return 'Error! day value can be between 1-31 only';
              }
      
              return TRUE;
          }
      
          /**
           * Check if date is with in nepali data range
           *
           * @param int $yy
           * @param int $mm
           * @param int $dd
           * @return bool
           */
          private function _is_in_range_nep($yy, $mm, $dd)
          {
              if ($yy < 2000 || $yy > 2089)
              {
                  return 'Supported only between 2000-2089';
              }
      
              if ($mm < 1 || $mm > 12)
              {
                  return 'Error! month value can be between 1-12 only';
              }
      
              if ($dd < 1 || $dd > 32)
              {
                  return 'Error! day value can be between 1-31 only';
              }
      
              return TRUE;
          }
      
          /**
           * Calculates wheather english year is leap year or not
           *
           * @param int $year
           * @return bool
           */
          public function is_leap_year($year)
          {
              $a = $year;
              if ($a % 100 == 0)
              {
                  if ($a % 400 == 0)
                  {
                      return TRUE;
                  }
                  else
                  {
                      return FALSE;
                  }
              }
              else
              {
                  if ($a % 4 == 0)
                  {
                      return TRUE;
                  }
                  else
                  {
                      return FALSE;
                  }
              }
          }
      
          /**
           * currently can only calculate the date between AD 1944-2033...
           *
           * @param int $yy
           * @param int $mm
           * @param int $dd
           * @return array
           */
          public function eng_to_nep($yy, $mm, $dd)
          {
              // Check for date range
              $chk = $this->_is_in_range_eng($yy, $mm, $dd);
      
              if($chk !== TRUE)
              {
                  die($chk);
              }
              else
              {
                  // Month data.
                  $month  = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
      
                  // Month for leap year
                  $lmonth = array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
      
                  $def_eyy     = 1944;    // initial english date.
                  $def_nyy     = 2000;
                  $def_nmm     = 9;
                  $def_ndd     = 17 - 1;  // inital nepali date.
                  $total_eDays = 0;
                  $total_nDays = 0;
                  $a           = 0;
                  $day         = 7 - 1;
                  $m           = 0;
                  $y           = 0;
                  $i           = 0;
                  $j           = 0;
                  $numDay      = 0;
      
                  // Count total no. of days in-terms year
                  for ($i = 0; $i < ($yy - $def_eyy); $i++) //total days for month calculation...(english)
                  {
                      if ($this->is_leap_year($def_eyy + $i) === TRUE)
                      {
                          for ($j = 0; $j < 12; $j++)
                          {
                              $total_eDays += $lmonth[$j];
                          }
                      }
                      else
                      {
                          for ($j = 0; $j < 12; $j++)
                          {
                              $total_eDays += $month[$j];
                          }
                      }
                  }
      
                  // Count total no. of days in-terms of month
                  for ($i = 0; $i < ($mm - 1); $i++)
                  {
                      if ($this->is_leap_year($yy) === TRUE)
                      {
                          $total_eDays += $lmonth[$i];
                      }
                      else
                      {
                          $total_eDays += $month[$i];
                      }
                  }
      
                  // Count total no. of days in-terms of date
                  $total_eDays += $dd;
      
      
                  $i           = 0;
                  $j           = $def_nmm;
                  $total_nDays = $def_ndd;
                  $m           = $def_nmm;
                  $y           = $def_nyy;
      
                  // Count nepali date from array
                  while ($total_eDays != 0)
                  {
                      $a = $this->_bs[$i][$j];
      
                      $total_nDays++;     //count the days
                      $day++;             //count the days interms of 7 days
      
                      if ($total_nDays > $a)
                      {
                          $m++;
                          $total_nDays = 1;
                          $j++;
                      }
      
                      if ($day > 7)
                      {
                          $day = 1;
                      }
      
                      if ($m > 12)
                      {
                          $y++;
                          $m = 1;
                      }
      
                      if ($j > 12)
                      {
                          $j = 1;
                          $i++;
                      }
      
                      $total_eDays--;
                  }
      
                  $numDay = $day;
      
                  $this->_nep_date['year']    = $y;
                  $this->_nep_date['month']   = $m;
                  $this->_nep_date['date']    = $total_nDays;
                  $this->_nep_date['day']     = $this->_get_day_of_week($day);
                  $this->_nep_date['nmonth']  = $this->_get_nepali_month($m);
                  $this->_nep_date['num_day'] = $numDay;
                  return $this->_nep_date;
              }
          }
      
      
          /**
           * Currently can only calculate the date between BS 2000-2089
           *
           * @param int $yy
           * @param int $mm
           * @param int $dd
           * @return array
           */
          public function nep_to_eng($yy, $mm, $dd)
          {
              $def_eyy     = 1943;
              $def_emm     = 4;
              $def_edd     = 14 - 1;  // initial english date.
              $def_nyy     = 2000;
              $def_nmm     = 1;
              $def_ndd     = 1;       // iniital equivalent nepali date.
              $total_eDays = 0;
              $total_nDays = 0;
              $a           = 0;
              $day         = 4 - 1;
              $m           = 0;
              $y           = 0;
              $i           = 0;
              $k           = 0;
              $numDay      = 0;
      
              $month  = array(
                  0,
                  31,
                  28,
                  31,
                  30,
                  31,
                  30,
                  31,
                  31,
                  30,
                  31,
                  30,
                  31
              );
              $lmonth = array(
                  0,
                  31,
                  29,
                  31,
                  30,
                  31,
                  30,
                  31,
                  31,
                  30,
                  31,
                  30,
                  31
              );
      
              // Check for date range
              $chk = $this->_is_in_range_nep($yy, $mm, $dd);
      
              if ( $chk !== TRUE)
              {
                  die($chk);
              }
              else
              {
                  // Count total days in-terms of year
                  for ($i = 0; $i < ($yy - $def_nyy); $i++)
                  {
                      for ($j = 1; $j <= 12; $j++)
                      {
                          $total_nDays += $this->_bs[$k][$j];
                      }
                      $k++;
                  }
      
                  // Count total days in-terms of month
                  for ($j = 1; $j < $mm; $j++)
                  {
                      $total_nDays += $this->_bs[$k][$j];
                  }
      
                  // Count total days in-terms of dat
                  $total_nDays += $dd;
      
                  // Calculation of equivalent english date...
                  $total_eDays = $def_edd;
                  $m           = $def_emm;
                  $y           = $def_eyy;
                  while ($total_nDays != 0)
                  {
                      if ($this->is_leap_year($y))
                      {
                          $a = $lmonth[$m];
                      }
                      else
                      {
                          $a = $month[$m];
                      }
      
                      $total_eDays++;
                      $day++;
      
                      if ($total_eDays > $a)
                      {
                          $m++;
                          $total_eDays = 1;
                          if ($m > 12)
                          {
                              $y++;
                              $m = 1;
                          }
                      }
      
                      if ($day > 7)
                      {
                          $day = 1;
                      }
      
                      $total_nDays--;
                  }
      
                  $numDay = $day;
      
                  $this->_eng_date['year']    = $y;
                  $this->_eng_date['month']   = $m;
                  $this->_eng_date['date']    = $total_eDays;
                  $this->_eng_date['day']     = $this->_get_day_of_week($day);
                  $this->_eng_date['nmonth']  = $this->_get_english_month($m);
                  $this->_eng_date['num_day'] = $numDay;
      
                  return $this->_eng_date;
              }
          }
      }
      
      //  Example:
      //  $cal = new Nepali_Calendar();
      //  print_r ($cal->eng_to_nep(2008,11,23));
      //  print_r($cal->nep_to_eng(2065,8,8));
      
      

      你只需要复制和粘贴,魔法就发生了。

      【讨论】:

      • 我仍然有同样的问题,当我输入 2076-07-01 到 2076-07-30 这样的日期时,它给了 29 天,但我想要 30
      • bro 30-1 总是给出 29。如果你想要包含减法,你需要在最后的解决方案中添加 1。我认为您的逻辑在某些地方不正确。如果您想获得不同 t 月日期之间的减法,您可以使用转换器来获得差异。
      • 也许你是对的,但这就是要求,30 到 15 必须是 15,30 到 1 应该是 30
      • 日期减法以自己独有的方式工作。您可以在末尾添加一个,以便获得所需的输出。
      • 如果此答案对您有帮助,请为答案投票并将其选为正确答案。支持社区
      猜你喜欢
      • 1970-01-01
      • 2022-08-12
      • 2014-06-17
      • 1970-01-01
      • 2015-02-26
      • 2019-09-27
      相关资源
      最近更新 更多