【问题标题】:Calculating how many years from "from - to" date form in Gravity Forms计算重力表格中“从 - 到”日期表格的多少年
【发布时间】:2015-09-10 16:17:08
【问题描述】:

我在这里有一个表单 (https://nursinggroup.com/pharmacist-profile/),用户将在其中为机器人输入“mm / yy”形式的日期,“from”输入框和“to”输入框。在用户完成并添加所有日期后,他们提交表单并使用 Gravity Forms PDF Extended (mPDF) 创建 PDF。我需要做的是,在创建 PDF 期间,我需要它来计算每个项目的值并将每个项目的总年数吐出到 PDF 上。

例如,如果我在在线表格中输入以下条目:

Ambulatory Care    "From: 02 / 88"   "To: 02 / 98"
Home Healthcare    "From: 07 / 02"   "To: 07 / 05"
Oncology           "From: 09 / 06"   "To: 05 / 12"

在 PDF 上它会吐出以下内容:

Ambulatory Care    10
Home Healthcare    3
Oncology           5.8

我已经通读并尝试了许多不同的代码示例,但我对这种类型的 PHP 的熟练程度不足以完成这项工作。还有一些其他的事情要记住。这是在 WordPress 网站上,使用 Gravity Forms 作为表单,使用 Gravity Forms PDF Extended 从这些表单创建 PDF。还有一点需要注意的是,年份的输入必须保持yy格式而不是yyyy用户也不填写一天,只有mm / yy

<?php

  // Set timezone
  date_default_timezone_set("UTC");

  // Time format is UNIX timestamp or
  // PHP strtotime compatible strings
  function dateDiff($time1, $time2, $precision = 6) {
    // If not numeric then convert texts to unix timestamps
    if (!is_int($time1)) {
      $time1 = strtotime($time1);
    }
    if (!is_int($time2)) {
      $time2 = strtotime($time2);
    }

    // If time1 is bigger than time2
    // Then swap time1 and time2
    if ($time1 > $time2) {
      $ttime = $time1;
      $time1 = $time2;
      $time2 = $ttime;
    }

    // Set up intervals and diffs arrays
    $intervals = array('year','month','day','hour','minute','second');
    $diffs = array();

    // Loop thru all intervals
    foreach ($intervals as $interval) {
      // Create temp time from time1 and interval
      $ttime = strtotime('+1 ' . $interval, $time1);
      // Set initial values
      $add = 1;
      $looped = 0;
      // Loop until temp time is smaller than time2
      while ($time2 >= $ttime) {
        // Create new temp time from time1 and interval
        $add++;
        $ttime = strtotime("+" . $add . " " . $interval, $time1);
        $looped++;
      }

      $time1 = strtotime("+" . $looped . " " . $interval, $time1);
      $diffs[$interval] = $looped;
    }

    $count = 0;
    $times = array();
    // Loop thru all diffs
    foreach ($diffs as $interval => $value) {
      // Break if we have needed precission
      if ($count >= $precision) {
 break;
      }
      // Add value and interval 
      // if value is bigger than 0
      if ($value > 0) {
 // Add s if value is not 1
 if ($value != 1) {
   $interval .= "s";
 }
 // Add value and interval to times array
 $times[] = $value . " " . $interval;
 $count++;
      }
    }

    // Return string with times
    return implode(", ", $times);
  }

?>

【问题讨论】:

  • 这种格式是固定的吗?解析输入 #^From: (\d{2}) / (\d{2})$##^To: (\d{2}) / (\d{2})$# 并查看 DateTime、DateDiff 和 DateInterval 类。
  • 格式是固定的,不能更改。我现在就来看看这些,我已经有了,但我还没有完全想好让这段代码工作。不够熟练,无法从头开始编写它,而且我在使用您上面提到的那些类来操作其他人的现有代码时遇到了困难。
  • 那么您在寻找什么?可以用来进行计算的函数?或者你有没有看过表单句柄代码?
  • 我想我需要的是一个函数。现在我已经对整个文件进行了编码,调用了数据库中的所有表单条目,并将它们打印在 PDF 上。基本上我想我需要的是一个函数,它将获取“开始”日期和“结束”日期变量并吐出它们之间的年数,为该数字分配一个变量,然后我可以从那里完成其余的工作。
  • 您知道 SO 可以帮助您解决问题……您自己吗?发布您尝试过的内容,我们可能会告诉您出了什么问题。另外,你在哪里划出哪个两位数年份属于 1900 年,哪个属于 2000 年? 01 / 50 是 1950 年还是 2050 年?

标签: php wordpress forms date


【解决方案1】:

我要做的是为计算的数字创建单独的字段。这样您就可以通过条目 ID 将它们直接输出到 PDF 中,而不必在 PDF 创建过程中运行任何自定义。

要计算年数,我建议使用这样的方法:

http://gravitywiz.com/calculate-number-of-days-between-two-dates/

它会计算天数;但是,可以通过更改此行轻松修改以计算年数:

dayCount = diff / ( 60 * 60 * 24 * 1000 );

...到这个:

dayCount = diff / ( 60 * 60 * 24 * 360 * 1000 );

您也可以重命名该变量,但您需要在当前范围内引用它的任何地方替换它。

【讨论】:

  • David 这看起来非常接近我要找的东西!我现在要搞砸一点,然后回复你。您是否预见到从我的自定义字段中提取与演示所说明的日期字段相比有任何问题?
  • 嘿大卫,所以在查看了您的建议和 Gravity Wiz 的代码之后,我决定去做,看起来它可以满足我的需要。我现在将所有自定义输入字段更改为日期选择器字段,以便它可以正常工作并且一切正常!我遇到的一个问题是代码正在四舍五入年数。因此,它不是吐出 4.5 年,而是显示 5 年。关于如何让它以十进制形式将确切数量吐出到一个占位符的任何想法?
  • 嘿 Brendan,舍入发生在这里:dayCount = Math.round( dayCount ) + this.options.countAdjust;如果你想要精确的十进制值,你可以这样做:dayCount = dayCount + this.options.countAdjust;如果您同意,请记住将其标记为正确答案。 ;)
  • 我说得很快。这确实给了我一个小数,但它并没有将小数四舍五入到最接近的十分之一。所以我需要它做的是围绕1.6588598 =&gt; 1.7 你能告诉我如何完成这个吗?
  • 你可以像这样四舍五入到一位小数:dayCount = ( Math.round( dayCount * 10 ) / 10 ) + this.options.countAdjust;
猜你喜欢
  • 2013-08-30
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2019-09-16
相关资源
最近更新 更多