【问题标题】:Substract a date compared to current date and show actual remaining days减去与当前日期相比的日期并显示实际剩余天数
【发布时间】:2018-12-19 21:29:51
【问题描述】:

这是我下面的函数:

function Active()
{
    ............

$num_rows = $db->doQuery('SELECT PremiumDays, PremiumStartTime FROM Premium WHERE AccountID = ?', $_SESSION['AccountID']);
if ($num_rows == -1)
{
$this->Error('ERROR');
$db->getError();
return;
}

$data = $db->doRead();
$data['Status'] = $num_rows == 0 ? '<:SHOW_PREMIUM_STATUS:>' : '<b><font size="2" color="red">Premium is active - <%Days_Remaining%> days remaining.</font></b>';

$replace = array
(
'account_status'        => $data['Status'],
'days_remaining'        => number_format($data['PremiumDays'])
);

$this->content = Template::Load('account-template', $replace);
}

PremiumDays 列包含诸如101530 等数字。

PremiumStartTime 包含此格式的日期2018-12-17 21:13:00

我想要实现的是显示days_remaining 的实际剩余保费天数。因此,我认为我需要根据第二列PremiumStartTime 减去自保费开始以来经过的天数。

我相信类似的东西,但是,我不确定如何在 PHP 中正确实现它。任何帮助是极大的赞赏。先感谢您!

days_remaining = PremiumDays - (NumberOfDaysSincePremiumStarted(DateToday - PremiumStartTime))

【问题讨论】:

标签: php sql-server


【解决方案1】:

要获得 PHP 中的差异,您可以使用 DateTime::diff 在当前时间(date_create() 的输出)和从您的 PremiumStartTime 变量创建的 DateTime 对象之间创建一个 DateInterval 对象。然后,您可以访问此对象的days 值以获取从PremiumStartTime 到当前时间的总天数。例如:

$data['PremiumStartTime'] = '2018-12-12 21:13:00';
$data['PremiumDays'] = 20;
$days_remaining = $data['PremiumDays'] - date_create($data['PremiumStartTime'])->diff(date_create())->days;
echo number_format($days_remaining);

输出:

13

Demo on 3v4l.org

【讨论】:

  • 谢谢!所以,我不会触及我的其他代码,而只会触及这一行:'days_remaining' =&gt; $data['PremiumDays'] - date_create($data['PremiumStartTime'])-&gt;diff(date_create())-&gt;days 它可以正常工作。安全吗?
  • 是的,您只需更改那一行。 “安全吗?”是什么意思?
  • 完全没问题。忽略安全部分。 ;-) 现在,我将不得不弄清楚如何使非负数显示。因为目前如果PremiumDays20 并且自PremiumStartTime 以来已经过去了20 天以上,它将以负数显示它,例如Remaining days -5。但这是我相信的另一个问题,因为您已经以完美的方式回答了我。非常感谢!
【解决方案2】:

在数据库中执行如下操作:

//SQL Server
$num_rows = $db->doQuery('SELECT PremiumDays, PremiumStartTime, 
             (PremiumDays - datediff(day,PremiumStartTime,getdate())) DaysRemaining 
              FROM Premium WHERE AccountID = ?', $_SESSION['AccountID']);


//MySQL
$num_rows = $db->doQuery('SELECT PremiumDays, PremiumStartTime, 
             (PremiumDays - datediff(now(),PremiumStartTime)) DaysRemaining 
              FROM Premium WHERE AccountID = ?', $_SESSION['AccountID']);

然后:

$replace = array
(
'account_status'        => $data['Status'],
'days_remaining'        => $data['DaysRemaining']
);

在这里证明:https://www.db-fiddle.com/f/xzuc89C9gQUHpdTTy9M4vf/0

或者如果你真的想用 PHP 来做:

$replace = array
(
'account_status'        => $data['Status'],
'days_remaining'        => $data['PremiumDays'] - date_diff(date_create(), date_create($data['PremiumStartTime']))->days
);

【讨论】:

  • 感谢您的回答。当我使用 SQL 服务器时,这 datediff(now()...) 是否适用?另外,现在我也必须编辑它? 'days_remaining' =&gt; number_format($data['DaysRemaining']) 对吗?谢谢!
  • 以上已修改为使用 SQL Server 而不是 MySQL
  • 非常感谢。在我接受之前,请您告诉我哪种方式 - SQL 或 PHP 在整体性能方面更好?
  • 像这样一次一行地做基本上没有区别。我个人会在 SQL 中这样做以保持代码简单。
  • 我刚刚测试了 SQL 代码,它给出了 500 HTTP 错误。我将now() 更改为getdate() 进行测试,网站加载但显示剩余天数不正确。那么,问题出在now() ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 2017-04-28
相关资源
最近更新 更多