我想获取一个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文档,了解返回数组中每个值的含义。