首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -从给定周中指定的工作日获取日期

问PHP -从给定周中指定的工作日获取日期
EN

Stack Overflow用户
提问于 2014-03-22 21:46:52
回答 2查看 253关注 0票数 0

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

例如:

工作日:- in week:8 -年份:13(平均2013年)。

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

请填写此php-方法:

代码语言:javascript
复制
function getDateWithSpecifiedValues($weekDayStr,$week,$year) {
    //return date();
}

其中的例子:

代码语言:javascript
复制
getDateWithSpecifiedValues("Tuesday",8,13);

将交回“2013年2月19日”

EN

回答 2

Stack Overflow用户

发布于 2014-03-22 22:09:45

首先,你必须定义你所说的“一年中的每周”是什么意思。有几种不同的定义。第一周从1月1日开始吗?在第一个星期天还是星期一?是一号还是零号?

有一个标准的定义,在ISO 8601中,它规定从周一到周日的每周,一年的第一个星期至少有4天的新年,而那个星期是第一周。你的例子中的预期产出与这个定义是一致的。

因此,您可以通过将它们放入字符串并将该字符串传递给strptime,以及一个自定义格式字符串告诉它字符串中的字段是什么来转换这些值。例如,星期数本身应该由%V以格式字符串表示。

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

现在,年份应该是%G (全年)或%g (仅为最后两位数)。这与正常的历年字段(2014年的%Y和2013年的%y )不同,因为2014年的第一周实际上是从2013年12月30日开始的,而2013年的“%Y”就是我们想要的2013年。但是,G字段在strptime中不能正常工作,所以您必须使用Y。

例如:

代码语言:javascript
复制
   $date_array = strptime("$weekDayStr $week $year", '%A %V %y');

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

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
 $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);

然后你可以用你需要的任何形式归还它。在这里,我把它作为字符串返回:

代码语言:javascript
复制
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);
}

例如,

代码语言:javascript
复制
php > print(getDateWithSpecifiedValues('Thursday',8,13)."\n");
21 Feb 2013
票数 1
EN

Stack Overflow用户

发布于 2014-03-22 21:59:12

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

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

代码语言:javascript
复制
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的文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22584012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档