如何查看交叉月份的日期

时间:2016-12-31 02:28:46

标签: php validation date datetime

我的活动仅在月份/年份的日期范围内执行。我需要验证当前日期是> = 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;
}

2 个答案:

答案 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')
);