背景信息
我正在为游戏玩家创建一个捐赠/购买系统。当用户通过paypal捐赠我有php代码处理ipn并将数据输入数据库时它还会生成一个串行密钥并通过电子邮件发送给用户,然后用户可以在游戏中输入此内容,当用户在游戏中进入串行检查时数据库看到密钥是否有效,然后执行相关的lua代码。到目前为止,该系统运作良好,但捐赠包持续一段时间30天,90天,180天和365天。
我想要实现的是当用户在游戏中输入密钥时,我将拥有存储玩家蒸汽ID的lua代码以及他们兑换它的日期以及包裹将持续多长时间。我将设置一个cron作业来运行一个脚本,检查数据库是否使用了密钥,如果密钥已被使用,它将检查,例如,自从他们兑换密钥以来是否已过去30天,如果它在30天内如果超过30天则不会做任何事情,那么它会将表格中的值从0更改为1。
问题
我真正努力想要解决的部分是如何存储日期和检查日期,最初我认为我会使用一年中的某一天但是随后会出现从365年到0如果有人在12月份购买它90天,那么就会发生错误。那么如何才能可靠地解决这一年的变化呢?
感谢所有发布答案并且速度非常快的人,我认为我现在已经有足够的工作了,再次感谢您的时间
答案 0 :(得分:2)
首先计算包裹过期的日期。 (如果需要,可以使用PHP的DateTime class完成)然后您只需将其与time()
进行比较
$date = new DateTime('2014-01-01'); //purchase date
$date->add(new DateInterval('P30D')); //in this case for 30 days
if(time() < $date->getTimestamp())
{
//expired
}
答案 1 :(得分:2)
好吧,我不知道你的数据库结构,但是我们说它是这样的:
user_table
-----------------------------------------
user_id | date_of_redeem | subscription
-----------------------------------------
user1 | 2014-02-01 | 90
user2 | 2014-05-18 | 365
user3 | 2014-07-22 | 180
因此,仅使用SQL语句,您可以使用某些内容,例如DATE_SUB。将date_of_redeem与今天的日期减去订阅金额进行比较。如果date_of_redeem的值较高,则会得到结果,否则会返回空结果集。
SELECT *
FROM `user_table`
WHERE `date_of_redeem` > DATE_SUB(NOW(), INTERVAL `subscription` DAY) AND `user_id` = 'desired_user_id'
编辑:上述查询的SQL小提琴:http://sqlfiddle.com/#!2/f95ea/11(只需将user3
更改为任何用户ID,以检查它们是否返回任何结果。
如果您想获得一张包含所有订阅到期日期的表格,那么您可以这样做:
SELECT `user_id` AS `User`, (DATE_ADD(`date_of_redeem`, INTERVAL `subscription` DAY)) AS `Subscription Ends`
FROM `user_table`
答案 2 :(得分:1)
使用Unix Timestamp。它将当前日期存储为数字。具体来说,自Unix Epoch以来的秒数。
当他们兑换代码时,存储当前的Unix时间戳。检查时,从当前的Unix时间戳中减去存储的Unix时间戳。如果它超过24 *#天有效,请停用代码。
存储
<?php
$date = time();
?>
检查
<?php
$validNumDays = 30;
$validNumSeconds = $validNumDays * 60 * 60 * 24;
$dbtime = GetStoredTimestamp();
$diff = time() - $dbtime;
if($diff > $validNumSeconds) { Deactivate(); }
?>