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


PHP - Get date from specified weekday in a given week

我想获取一个PHP日期()从指定的工作日在给定的一周。

例如:

周四工作日:

-周: 8 年: 13 (意味着2013年)。

我想从这些指定的值返回一个日期。在这种情况下,php将返回:"21 Feb 2013",这是2013年第8周的星期四。

请填写php-method:

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

其中示例:

getDateWithSpecifiedValues("Tuesday",8,13);

将返回"19 Feb 2013"的更新

首先,您必须定义"一年中的星期"是什么意思。有几种不同的定义。第一周是从1月1日开始吗?第一个星期天还是星期一?是1号还是0号?

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

因此,您可以通过将它们放入字符串并将该字符串传递给strptime来转换值,并使用自定义格式字符串告诉它字符串中的字段是什么。例如,周号本身应该在格式字符串中由%V表示。

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

现在,年份应该是%G(全年)或%g(只有最后两位数字)。它不同于正常的日历年字段(%Y表示2014年,%y表示2013年),因为,例如,2014年的第1周实际上开始于2013年12月30日,显然在我们想要2014年的地方有2013年的"%Y"。但是,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

试试这个函数:

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');
}
演示

我很确定1月21日和1月19日都不在第八周。

你可以使用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) ""
}

请参阅strptime文档,了解返回数组中每个值的含义。