PHP - 在给定的一周内从指定的工作日获取日期

时间:2014-03-22 21:46:53

标签: php date strtotime

我不想在给定的一周内从指定的工作日获得PHP日期()。

例如:

平日:周四 - 周内: 8 - 年: 13 (表示2013年)。

我想从这些指定值返回日期。在这种情况下,该数据将返回:“2013年2月21日”,即2013年第8周的星期四。

请填写这个php方法:

function getDateWithSpecifiedValues($weekDayStr,$week,$year) {
    //return date();
}

示例:

getDateWithSpecifiedValues("Tuesday",8,13);

将返回“2013年2月19日”的文章

3 个答案:

答案 0 :(得分:1)

首先,你必须用“一年中的一周”来定义你的意思。有几种不同的定义。第一周是从1月1日开始的吗?在第一个星期天或星期一?它是1号还是0号?

有一个标准定义,在ISO 8601中编纂,表示周从周一到周日,一年中的第一个是新年至少4天的那个,那一周是数字1.您的示例预期输出与该定义一致。

因此,您可以通过将值转换为字符串并将该字符串传递给strptime来转换值,并将自定义格式字符串告诉它字符串中的字段。例如,周数本身应在格式字符串中以%V表示。

对于工作日,格式取决于您希望如何将其作为函数的输入提供。如果你有全名(例如“星期四”),那就是%A。如果您有缩写名称(例如“Thu”),那就是%a。如果你有一个数字(例如4),那就是%w(如果星期日是0)或%u(如果星期日是7)。 (如果您不确定,可以随时使用%w并传递号码% 7。)

现在,年份应为%G(全年)或%g(仅为最后两位数)。它与正常的日历年字段(2014年为%Y和13为%y)有所不同,例如,2014年第1周实际上于2013年12月30日开始,显然有'%Y'我们想要2014年的2013年。但是,G字段与strptime无法正常工作,因此您必须使用Y.

例如:

   $date_array = strptime("$weekDayStr $week $year", '%A %V %y');

这是一个好的开始,但strptime的返回值是一个数组:

array('tm_sec' => seconds, 'tm_min' => minutes, tm_hour => hour, 
       tm_mday => day of month, tm_mon => month number (0..11), tm_year => year - 1900)

据我所知,该数组不是任何其他常见日期或时间函数所期望的输入。你必须自己提取值并在某些情况下修改它们并将结果传递给某些东西以获得你想要的东西。例如:

 $time_t = mktime($date_array['tm_hour'], $date_array['tm_min'],
                  $date_array['tm_sec'],  $date_array['tm_mon']+1,
                  $date_array['tm_mday'], $date_array['tm_year']+1900);

然后你可以以任何你需要的形式返回它。在这里,我将它作为一个字符串返回:

function getDateWithSpecifiedValues($weekDayStr,$week,$year) {
    $date_array = strptime("$weekDayStr $week $year", '%A %V %y');
    $time_t = mktime($date_array['tm_hour'], $date_array['tm_min'],
                     $date_array['tm_sec'],  $date_array['tm_mon']+1,
                     $date_array['tm_mday'], $date_array['tm_year']+1900);
    return strftime('%d %b %Y', $time_t);
}

例如,

php > print(getDateWithSpecifiedValues('Thursday',8,13)."\n");
21 Feb 2013

答案 1 :(得分:1)

尝试此功能:

function getDateWithSpecifiedValues($weekDayStr, $week, $year) {
    $dt = DateTime::createFromFormat('y, l', "$year, $weekDayStr");
    return $dt->setISODate($dt->format('o'), $week, $dt->format('N'))->format('j M Y');
}

demo

答案 2 :(得分:0)

我相当肯定,1月21日或1月19日都不是第8周。

但是,您可以使用strptime来解析自定义格式:

var_dump(strptime("Thursday 8 13", "%A %V %y"));

array(9) {
  ["tm_sec"]=>
  int(0)
  ["tm_min"]=>
  int(0)
  ["tm_hour"]=>
  int(0)
  ["tm_mday"]=>
  int(21)
  ["tm_mon"]=>
  int(1)
  ["tm_year"]=>
  int(113)
  ["tm_wday"]=>
  int(4)
  ["tm_yday"]=>
  int(58)
  ["unparsed"]=>
  string(0) ""
}

请参阅the documentation for strptime了解返回数组中每个值的含义。

相关问题