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