首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >找出日期是否在两个日期之间,忽略年份

找出日期是否在两个日期之间,忽略年份
EN

Stack Overflow用户
提问于 2013-07-09 12:59:38
回答 4查看 6.1K关注 0票数 6

我需要确定一个日期(月和日)是否介于另外两个月/日之间。

我在这篇文章中附上了一张图片,描述了我正在尝试做的事情。基本上,示例"current day“以红色突出显示,它位于最近的日期(3月15日和11月22日)之间。但是,当我使用Unix时间戳并人为地在日期中添加年份时,脚本认为11月22日还没有发生,因此它建议2月1日在3月15日和11月22日之前,而不是介于两者之间。因此,我需要在不使用年份的情况下比较日期。

希望这是有意义的。我只想使用月份和天来比较日期,但忽略年份,并使用像我在图像中显示的轮子一样的框架。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-09 14:17:18

您的示例中的问题是(在同一年)上限日期在下限日期之前。在这种情况下,任何小于上限(1月1日-3月14日)或大于下限(11月23日-12月31日)的日期都在这两者之间。

代码语言:javascript
运行
复制
<?php
    $upperBound = new DateTime("Mar 15");
    $lowerBound = new DateTime("Nov 22");
    $checkDate = new DateTime("Feb 1");

    if ($lowerBound < $upperBound) {
        $between = $lowerBound < $checkDate && $checkDate < $upperBound;
    } else {
        $between = $checkDate < $upperBound || $checkDate > $lowerBound;
    }
    var_dump($between);
?>

显示:boolean true

编辑

如果您要检查的日期是“2月29日”,并且当前年份不是闰年,则DateTime会将其解释为“3月1日”。

要检查日期是否介于两个日期之间,请使用:

代码语言:javascript
运行
复制
if ($lowerBound < $upperBound) {
    $between = $lowerBound <= $checkDate && $checkDate <= $upperBound;
} else {
    $between = $checkDate <= $upperBound || $checkDate >= $lowerBound;
}
票数 5
EN

Stack Overflow用户

发布于 2013-07-09 14:00:37

要解决此问题,您可以将日期转换为MMDD形式的4位数字。

代码语言:javascript
运行
复制
$start = '1122';
$end = '0315';
$date = '0201';

如果你还没有这样格式化你的日期,你可以使用date('md', $timestamp),或者只是通过$month * 100 + $day来计算数字;

然后,您的测试逻辑将根据您是否跨越一年的界限而改变。把所有这些放在一起,它可能看起来像这样:

代码语言:javascript
运行
复制
function isDateBetween($testM, $testD, $startM, $startD, $endM, $endD) {
    $start = $startM*100 + $startD;
    $end = $endM*100 + $endD;
    $date = $testM*100 + $testD;

    if ($start > $end) {
        // crossing a year boundary
        return ($date > $start) || ($date < $end);
    } else {
        // not crossing a year
        return ($date > $start) && ($date < $end);
    }
}

下面是一些调用此函数的示例:

代码语言:javascript
运行
复制
// your example given above
isDateBetween(2, 1, 11, 22, 3, 15); // true

// ends the day after instead
isDateBetween(3, 16, 11, 22, 3, 15); // false

// reverse the dates in your example
isDateBetween(2, 1, 3, 15, 11, 22); // false

// ends the day after, with reversed dates
isDateBetween(3, 16, 3, 15, 11, 22); // true 
票数 0
EN

Stack Overflow用户

发布于 2013-07-09 13:41:13

代码语言:javascript
运行
复制
//must be 2 digit month, then 2 digit day, like mm-dd
$low  = '03-15';
$high = '11-22';
$date = '02-01';

$isBetween = $date >= $low && $date <= $high;
var_dump($isBetween);

我使用了字典排序,这是php比较字符串的方式。关键点是将最大的单位放在左边(月),并确保向左填充每个数字段到相同的长度,使用零填充。

如果您还没有将日期设置为这样的字符串格式,可以使用date('m-d', $timestamp)函数来实现。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17540268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档