当前位置: 首页 > 面试题库 >

获取下一年的星期一和星期二的所有日期

冯敏达
2023-03-14
问题内容

我需要输出从当前日期开始的未来12个月的日期列表(仅星期一和星期二),如下所示:

2010年1月
星期二2010年1月12日
星期一2010 年1月18日
星期二2010 年1月19日
星期一2010 年1月25 日星期一2010年
2月2日
星期二2010 年2月8日
星期一2010年2月9日星期二2010 年
2月
15 日星期一2010年2月15日
星期二2010 年2月16日
星期一2010 年2月22日星期一2010年
3月
9 日星期二
2010
年3月15日星期一2010年3月16 日星期二


作为PHP的新手,我认为 strtotime 并在接下来的52周内循环是最好的方法。

$blockedDatesInput = "08 Mar 2010,12 Apr 2010"; // dont show these dates
$blockedDates = explode ("," , $blockedDatesInput); // convert to array
$currentMonth = ""; // current month marker

// loop over the next 52 weeks to find Mondays and Tuesdays
for($i=0; $i<=52; $i++){
// build the month header
$monthReference = date("M Y", strtotime('+'.$i.' Week'));

// check if date exists in $blockeddate
if (!in_array(date("d M Y", strtotime('+'.$i.' Monday')), $blockedDates) || 
    !in_array(date("d M Y", strtotime('+'.$i.' Tuesday')), $blockedDates) ) {
     // check if we have to show a new month
     if(strcmp($monthReference, $currentMonth) <> 0){
       echo $monthReference.'<br />',"\n";
     }else{
      // output the dates
      echo date("D d M Y", strtotime('+'.$i.' Monday')).'<br />',"\n";
      echo date("D d M Y", strtotime('+'.$i.' Tuesday')).'<br />',"\n";
     }
       $currentMonth = date("M Y", strtotime('+'.$i.' Week'));
   }
}

但是我的代码的输出是

2010
年1月1日星期一2010年1月18日
星期二2010 年1月12日
星期一2010 年1月25日
星期二2010年
2月19 日
星期一2010年2月8 日星期一2010年2月2日星期一2010年
2月
15 日星期一2010 年2月
9 日星期二2010
年2月22 日星期一2010 年2月
16日2010年
3月16 日
星期一2010年3月8 日星期一
2010
年3月2日
星期二2010 年3月15 日星期一2010 年3月9日
星期一2010年3月22 日星期一2010 年3月
16 日星期二2010
年3月29 日星期一2010 年3月
23 日星期二

如您所见,日期的顺序不正确,在这里我错了,我很茫然。

有没有更优雅/简单的方法来解决这个问题?

所使用的PHP版本是5.2.11,并且没有希望很快到5.3的可能性:-(

谢谢你的帮助。

下面的代码由Aly建议修改。将计算机日期从2010年12月1日星期二更改为2010年13月1日星期三以测试输出。

$blockedDatesInput = "08 Mar 2010,12 Apr 2010"; // dont show these dates
$blockedDates = explode ("," , $blockedDatesInput); // convert to array
$currentMonth = ""; // current month marker

// loop over the next 52 weeks to find Mondays and Tuesdays
for($i=0; $i<=52; $i++){
// build the month header
$monthReference = date("M Y", strtotime('+'.$i.' Week'));

// check if date exists in $blockeddate
if (!in_array(date("d M Y", strtotime('+'.$i.' Monday')), $blockedDates) || 
    !in_array(date("d M Y", strtotime('+'.$i.' Tuesday')), $blockedDates) ) {
     // check if we have to show a new month
     if(strcmp($monthReference, $currentMonth) <> 0){
       echo $monthReference.'<br />',"\n";
     }else{
      // output the dates (changed the order as suggested by Aly)
      echo date("D d M Y", strtotime('+'.$i.' Tuesday')).'<br />',"\n";
      echo date("D d M Y", strtotime('+'.$i.' Monday')).'<br />',"\n";          
     }
       $currentMonth = date("M Y", strtotime('+'.$i.' Week'));
   }
}

再次以错误的顺序输出。

2010年1月
星期二2010年1月19日
星期一2010 年1月18日
星期二2010 年1月26日
星期一2010 年1月25 日星期一2010年
2月
9日2010 年2月9日
星期一2010年2月8日星期二2010年2月
16日
星期一2010 年2月15日星期一2010
年2月23日星期二2010 年2月
22日星期一


问题答案:

这是一个有趣的。这是我对函数的处理方式,尽管它可以保证自己的类确实是模块化的和可重用的:

Set up my date formats and excluded dates
define('INTERNAL_FORMAT', 'Y-m-d');
define('DISPLAY_MONTH_FORMAT', 'M Y');
define('DISPLAY_DAY_FORMAT', 'D d M Y');
// format excluded dates as YYYY-MM-DD, date('Y-m-d'):
$excluded_dates = array(
    '2010-03-09',
    '2010-04-13',
);

然后,我需要一些实用程序函数来查看日期如何运行以及排除哪些日期:

// date('w') returns a string numeral as follows:
//   '0' Sunday
//   '1' Monday
//   '2' Tuesday
//   '3' Wednesday
//   '4' Thursday
//   '5' Friday
//   '6' Saturday
function isTuesday($date) {
    return date('w', strtotime($date)) === '2';
}
function isWednesday($date) {
    return date('w', strtotime($date)) === '3';
}

// handle the excluded dates
function isExcludedDate($internal_date) {
    global $excluded_dates;
    return in_array($internal_date, $excluded_dates);
}

现在,我们只需要遍历下一个365天(第二年)的每一天,并检查它们是否在星期二或星期三,而不在排除列表中。我们将其存储在$months_and_dates

$start_date = date(INTERNAL_FORMAT);

// something to store months and days
$months_and_dates = array();

// loop over 365 days and look for tuesdays or wednesdays not in the excluded list
foreach(range(0,365) as $day) {
    $internal_date = date(INTERNAL_FORMAT, strtotime("{$start_date} + {$day} days"));
    $this_day = date(DISPLAY_DAY_FORMAT, strtotime($internal_date));
    $this_month = date(DISPLAY_MONTH_FORMAT, strtotime($internal_date));
    if ((isTuesday($internal_date) || isWednesday($internal_date)) 
        && !isExcludedDate($internal_date)) {
            $months_and_dates[$this_month][] = $this_day;
    }
}

可以print_r(),或者要获得所需的显示,我们可以这样做:

foreach($months_and_dates as $month => $days) {
    print $month . "<br>";
    print implode('<br>', $days);
    print "<br>";
}

以下是截至2010年1月11日的结果:

Jan 2010
Tue 12 Jan 2010
Wed 13 Jan 2010
Tue 19 Jan 2010
Wed 20 Jan 2010
Tue 26 Jan 2010
Wed 27 Jan 2010
Feb 2010
Tue 02 Feb 2010
Wed 03 Feb 2010
Tue 09 Feb 2010
Wed 10 Feb 2010
Tue 16 Feb 2010
Wed 17 Feb 2010
Tue 23 Feb 2010
Wed 24 Feb 2010
Mar 2010
Tue 02 Mar 2010
Wed 03 Mar 2010
Wed 10 Mar 2010
Tue 16 Mar 2010
Wed 17 Mar 2010
Tue 23 Mar 2010
Wed 24 Mar 2010
Tue 30 Mar 2010
Wed 31 Mar 2010
Apr 2010
Tue 06 Apr 2010
Wed 07 Apr 2010
Wed 14 Apr 2010
Tue 20 Apr 2010
Wed 21 Apr 2010
Tue 27 Apr 2010
Wed 28 Apr 2010
May 2010
Tue 04 May 2010
Wed 05 May 2010
Tue 11 May 2010
Wed 12 May 2010
Tue 18 May 2010
Wed 19 May 2010
Tue 25 May 2010
Wed 26 May 2010
Jun 2010
Tue 01 Jun 2010
Wed 02 Jun 2010
Tue 08 Jun 2010
Wed 09 Jun 2010
Tue 15 Jun 2010
Wed 16 Jun 2010
Tue 22 Jun 2010
Wed 23 Jun 2010
Tue 29 Jun 2010
Wed 30 Jun 2010
Jul 2010
Tue 06 Jul 2010
Wed 07 Jul 2010
Tue 13 Jul 2010
Wed 14 Jul 2010
Tue 20 Jul 2010
Wed 21 Jul 2010
Tue 27 Jul 2010
Wed 28 Jul 2010
Aug 2010
Tue 03 Aug 2010
Wed 04 Aug 2010
Tue 10 Aug 2010
Wed 11 Aug 2010
Tue 17 Aug 2010
Wed 18 Aug 2010
Tue 24 Aug 2010
Wed 25 Aug 2010
Tue 31 Aug 2010
Sep 2010
Wed 01 Sep 2010
Tue 07 Sep 2010
Wed 08 Sep 2010
Tue 14 Sep 2010
Wed 15 Sep 2010
Tue 21 Sep 2010
Wed 22 Sep 2010
Tue 28 Sep 2010
Wed 29 Sep 2010
Oct 2010
Tue 05 Oct 2010
Wed 06 Oct 2010
Tue 12 Oct 2010
Wed 13 Oct 2010
Tue 19 Oct 2010
Wed 20 Oct 2010
Tue 26 Oct 2010
Wed 27 Oct 2010
Nov 2010
Tue 02 Nov 2010
Wed 03 Nov 2010
Tue 09 Nov 2010
Wed 10 Nov 2010
Tue 16 Nov 2010
Wed 17 Nov 2010
Tue 23 Nov 2010
Wed 24 Nov 2010
Tue 30 Nov 2010
Dec 2010
Wed 01 Dec 2010
Tue 07 Dec 2010
Wed 08 Dec 2010
Tue 14 Dec 2010
Wed 15 Dec 2010
Tue 21 Dec 2010
Wed 22 Dec 2010
Tue 28 Dec 2010
Wed 29 Dec 2010
Jan 2011
Tue 04 Jan 2011
Wed 05 Jan 2011
Tue 11 Jan 2011


 类似资料:
  • 我想使用Java8包Java从给定的星期和年份中获取星期一日期。时间但在某种程度上,我面临着这个问题,因为它并没有返回正确的日期。 例如: 如果我通过周=1和年=2013那么日期是:2012-12-31。 但是如果我通过了周=53和年=2015,那么日期是: 2014-12-29。我期待2014-12-28。 我是否有任何逻辑错误或其他问题?

  • 问题内容: 因此,对于一个开始日期和结束日期,我想确定在这两个日期之间发生的一周中的特定天数。 那么多少个星期一,星期二等 我知道我可以在“开始日期”和“结束日期”之间循环并每天检查一次,但是可能相差很多天。我更喜欢不需要循环的东西。有任何想法吗?(必须在SQL Server2005+中受支持) 问题答案: 鉴于我 认为 您正在尝试获得的结果,应该这样做:

  • 问题内容: 我已经实现了一种获取当前星期中星期一的日期的方法,并且已经将星期一指定为星期的第一天。 但是,无论我做什么,它都会返回2013年3月24日格林尼治标准时间。我看不到这里的问题。有人能帮忙吗? 问题答案: 试试这个 :

  • 问题内容: 我想确定一个日期并计算出其星期数。 到目前为止,我有以下内容。它应该是42时返回24。 数字反转是巧合吗?还是我快到了? 问题答案: 今天,使用PHP的对象会更好: 这是因为in中,它是这样的: 因此,您的订单是错误的。

  • 问题内容: 如何获得当前一周的星期一和星期五的日期? 我有以下代码,但是如果当前日期是星期日或星期六,则它将失败。 问题答案: 这些strtotime输入效果很好: 您需要做的就是将逻辑包装在一些if语句中。

  • 问题内容: 我目前有此代码: 这是Date对象的扩展。 我需要做同样的事情,但是让日历返回我从星期一开始而不是星期日的一周中的几天。 问题答案: 您只需要使用iso8601日历获取一周中的第一天,其中第一个工作日为星期一,并添加0至6天。尝试这样: