Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 日期时间:转换为';yW';最早和最晚的日期,然后返回到';yW';? 问题是:_Php_Datetime_Week Number - Fatal编程技术网

Php 日期时间:转换为';yW';最早和最晚的日期,然后返回到';yW';? 问题是:

Php 日期时间:转换为';yW';最早和最晚的日期,然后返回到';yW';? 问题是:,php,datetime,week-number,Php,Datetime,Week Number,我们有些产品使用“YYWW”(date('yW'))格式来标识创建日期。 有时我们甚至连一周的时间都没有。。我们需要处理的就是年份值 我目前正在使用DateTime->setISODate()从年值和周值中获取日期。 由于新年的转折通常是在日历周的中间,所以我们的最小日期通常是在考虑第一周的前一年。 这本身并不是什么大问题,但当试图转换回原始日期代码字符串时,我得到了错误的年份值 目标: 我们的目标是 将给定的YYWW值作为两个值存储到数据库中,即它们的最早日期和最晚日期 然后,根据这些最小/最

我们有些产品使用“YYWW”(
date('yW')
)格式来标识创建日期。
有时我们甚至连一周的时间都没有。。我们需要处理的就是年份值

我目前正在使用
DateTime->setISODate()
从年值和周值中获取日期。
由于新年的转折通常是在日历周的中间,所以我们的最小日期通常是在考虑第一周的前一年。 这本身并不是什么大问题,但当试图转换回原始日期代码字符串时,我得到了错误的年份值

目标: 我们的目标是

  • 将给定的YYWW值作为两个值存储到数据库中,即它们的最早日期和最晚日期
  • 然后,根据这些最小/最大日期,在视图需要时准确地重建原始年/周字符串
  • 示例:从“代码”到“日期”:确定

    • 代码“09”变为min 2008-12-29/max 2009-12-27
    • 代码“0901”变为min 2008-12-29/max 2009-01-04
    • 代码“0922”变为min 2009-05-25/max 2009-05-31

    示例:从“日期”到“代码”:失败

    • 日期2009-12-27=“0952”。。。成功
    • 日期2009-05-31=“0922”。。。成功
    • 日期2009-05-25=“0922”。。。成功
    • 日期2009-01-04=“0901”。。。成功
    • 日期2008-12-29=“0801”。。。失败:预期为“0901”
    尝试:
    ####为了简洁而简化###
    $dateOfMfg='0901';
    $dc=aCustomValidatorAndStuff($dateOfMfg);//返回数组('year'=>2009,'week'=>1)
    $dateTimeMin=new DateTime();
    $dateTimeMax=新的DateTime();
    $result=数组(
    “min”=>$dateTimeMin->setISODate($dc['year',$dc['week',1),
    “max”=>$dateTimeMax->setISODate($dc['year'],$dc['week'],7),
    );
    回显“结果:
    ”,变量转储($Result),“”; 回显“Min:”,$result['Min']->格式('yW'),“
    ;”/"0801" ... 坏的 回显“Min:”,$result['max']->格式('yW'),“
    ;”/"0901" ... 好
    总结: 是否有一种本地方法可以获取该“最小”年份的相应年份值?

    还有什么其他建议吗?

    我认为在数据库中存储日历表最有意义。日历表可以大大简化您的代码。针对日历表编写的查询通常是正确的。这很有价值

    使用日历表回答失败问题的一种方法是返回完整的日期集

    select c2.cal_date
    from calendar c1
    inner join calendar c2 
            on c1.iso_year = c2.iso_year
           and c1.iso_week = c2.iso_week
    where c1.cal_date ='2008-12-29'
    order by c2.cal_date;
    
    我认为这句话更容易理解,但连接通常表现得更好

    需要思考的事情

    代码“09”变为min 2008-12-29/max 2009-12-27

    国际标准化组织2009年从2008年12月29日开始,但不会在2009年12月27日结束。于2010年1月3日结束

    select cal_date
    from calendar
    where iso_year = (select iso_year from calendar where cal_date = '2008-12-29')
      and iso_week = (select iso_week from calendar where cal_date = '2008-12-29')
    order by cal_date;
    
    cal_date
    --
    2008-12-29
    2008-12-30
    2008-12-31
    2009-01-01
    2009-01-02
    2009-01-03
    2009-01-04
    
    select c2.cal_date
    from calendar c1
    inner join calendar c2 
            on c1.iso_year = c2.iso_year
           and c1.iso_week = c2.iso_week
    where c1.cal_date ='2008-12-29'
    order by c2.cal_date;