首先,您必须定义“一年中的一周”是什么意思。有几种不同的定义。第一周是从 1 月 1 日开始吗?在第一个星期日还是星期一?它是数字 1 还是 0?
ISO 8601 中有一个标准定义,规定周从周一到周日,一年中的第一个是新年至少有 4 天的那一周,那一周是数字1. 您的示例预期输出与该定义一致。
因此,您可以通过将值放入字符串并将该字符串传递给strptime 来转换这些值,同时还有一个自定义格式字符串告诉它字符串中的字段是什么。例如,周数本身应在格式字符串中由%V 指示。
对于工作日,格式取决于您希望如何将其作为函数的输入提供。如果您有全名(例如“Thursday”),那就是%A。如果您有缩写名称(例如“Thu”),那就是 %a。如果您有一个数字(例如 4),那是 %w(如果星期日是 0)或 %u(如果星期日是 7)。 (如果您不确定,您可以随时使用%w 并传递号码% 7。)
现在,年份应该是%G(全年)或%g(只是最后两位数)。它不同于正常的日历年字段(%Y 表示 2014 年,%y 表示 13 年),因为例如,2014 年的第 1 周实际上是从 2013 年 12 月 30 日开始的,显然 2013 年的“%Y”是我们想要 2014。但是,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