我的活动仅在月份/年份的日期范围内执行。我需要验证当前日期是> = 30和< = 05(下个月)。
以下示例代码:
$t = microtime(true);
$micro = sprintf("%06d",($t - floor($t)) * 1000000);
$d = new DateTime( date('Y-m-d H:i:s.'.$micro, $t) );
$date = substr($d->format("d"),0,2);
if($date >= 30000000 && $date <= 05000000){
$validate = true;
}
我根本无法使用&gt; = 30和&lt; = 05,因为它是无效范围。或者我应该编码:
if($date = 30 || $date = 31 || $date = 01 || $date = 02 || $date = 03 || $date = 04 || $date = 05){
$validate = true;
}
答案 0 :(得分:1)
是的,我认为你的代码还可以。你可以通过使用时间戳来做,但我的代码可能会有一些改进:
$dates = array(30, 31, 1, 2, 3, 4, 5);
if (in_array(((int)$date), $dates)
$validate = true;
答案 1 :(得分:1)
我的活动仅在月份/年份的日期范围内执行。我需要验证当前日期是&gt; = 30和&lt; = 05(下个月)。
根据定义,当前日期不能出现在下个月。因此,如果您想检查当前日期是否在1 st 和5 th 之间,或者是否大于30 th ,您可以只需使用$day = $datetime->format('j')
获取当天,然后检查$day <= 5
或$day >= 30
。
使用当前日期构造DateTime
对象只需调用不带参数的构造函数。例如:
function validate($format = 'now') {
$now = new DateTime($format);
$day = $now->format('j');
return ($day >= 30 || $day <= 5);
}
<强>测试强>
// Create DateTime object for the first day of the current month
$d = new DateTime('first day of');
$day_to = (new DateTime())->format('j');
for ($i = 0; $i < $day_to; $i++) {
printf("%d: %d\n", $i + 1, validate('@' . $d->getTimestamp() . " + $i days"));
}
输出
1: 1
2: 1
3: 1
4: 1
5: 1
6: 0
7: 0
...
27: 0
28: 0
29: 0
30: 1
31: 1
如果要检查日期是否属于某个日期范围,请使用DateTime
对象上的比较运算符。
在您的特定情况下,您可以为范围构造两个DateTime
对象,并将它们与任何DateTime
对象进行比较,如以下示例所示:
$d = new DateTime('2017-02-01 20:15');
// 5th day of the next month
$rhd = new DateTime('first day of next month');
$rhd->modify('+4 day');
$rhd->setTime(0, 0, 0);
// 30th day of the current month
$lhd = new DateTime('first day of');
$lhd->modify('+29 day');
$lhd->setTime(0, 0, 0);
printf(
"%s %s between\n%s and\n%s\n",
$d->format('r'),
($d >= $lhd && $d <= $rhd) ? 'is' : 'is not',
$lhd->format('r'),
$rhd->format('r')
);