【问题标题】:PHP - Get date from specified weekday in a given weekPHP - 从给定一周的指定工作日获取日期
【发布时间】:2014-04-30 07:27:49
【问题描述】:

我不想从给定周的指定工作日获取 PHP date()。

例如:

工作日:星期四 - 每周:8 - 年:13(表示 2013 年)。

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

请填写此php-method:

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

例子:

getDateWithSpecifiedValues("Tuesday",8,13);

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

【问题讨论】:

标签: php date strtotime


【解决方案1】:

首先,您必须定义“一年中的一周”是什么意思。有几种不同的定义。第一周是从 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

【讨论】:

    【解决方案2】:

    试试这个功能:

    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

    【讨论】:

      【解决方案3】:

      我很确定 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

      【讨论】:

      • 请注意,虽然在这种情况下您必须使用%y,但它并不是真正正确的格式。 %g 是年份的最后两位数字,与 ISO 周数一起使用。但是 PHP 的 strptime 不能正确处理它,所以你必须使用 %y 并注意输入中的任何边缘情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 2017-10-19
      相关资源
      最近更新 更多