【问题标题】:How do I check day for cross month如何查看跨月的日期
【发布时间】:2016-12-31 02:28:45
【问题描述】:

我有一项活动,无论月/年,都只在某个日期范围内执行。我需要验证当前日期是否 >= 30 和

示例代码如下:

$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;
}

我根本不能使用 >= 30 和

if($date = 30 || $date = 31 || $date = 01 || $date = 02 || $date = 03 || $date = 04 || $date = 05){
    $validate = true;
}

【问题讨论】:

  • 您应该使用'j' 格式说明符而不是'd': $day = $d-&gt;format('j');。无需字符串操作。
  • 您不需要microtime 来为当前日期/时间构建DateTime 对象。只需调用不带参数的构造函数:$d = new DateTime();

标签: php validation date datetime


【解决方案1】:

是的,我认为您的代码没问题。我猜你可以通过使用时间戳来做到这一点,但你的代码可能会有一点改进:

$dates = array(30, 31, 1, 2, 3, 4, 5);
if (in_array(((int)$date), $dates)
    $validate = true;

【讨论】:

    【解决方案2】:

    当前日期

    我有一项活动,无论月/年,都只在某个日期范围内执行。我需要验证当前日期是否 >= 30 和

    根据定义,当前日期不能在下个月。因此,如果您想检查当前日期是在 1st 和 5th 之间还是大于 30th,您可以只需使用$day = $datetime-&gt;format('j') 获取当天并检查是$day &lt;= 5 还是$day &gt;= 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')
    );
    

    【讨论】:

    • 如果当前日期是 6 号,它会返回 true 不是吗?
    • @4LeaveCover,为什么,不,它会返回 false,因为6 &lt; 306 &gt; 5。您可以使用不同的参数对其进行测试,例如new DateTime("now + 6 days")
    • 我不赞成,因为我想要的范围是(当月)30,31,1,2,3,4,5(下个月),而不是(当月)1,2,3 ,4,5,30,31(当前月份)。但感谢您的努力。
    • @4LeaveCover,根据定义,当天不能在下个月。为了检查任意日期是否介于日期范围之间,请构造 DateTime 对象并使用比较运算符(&gt;=&lt;=)进行比较,如新示例所示。
    • @4LeaveCover,顺便说一句,接受的答案以非常低效的 O(n) 方式检查 DateTime 对象(即当前对象)的日期。您可以检查$day &gt;= 30 or $day &lt;= 5 是否具有相同的效果,但效率更高。
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多