如何在PHP(多平台)中获取给定周数的第一天?
在PHP中最简单的方法是什么 我想要一年中给定周数的星期一的日期(例如:2009年第3周) 谢谢 编辑:如果您只使用Linux机器,请使用cletus的解决方案,不过我正在寻找可以在Windows和Linux上工作的解决方案 您可以使用来获取时间如何在PHP(多平台)中获取给定周数的第一天?,php,Php,在PHP中最简单的方法是什么 我想要一年中给定周数的星期一的日期(例如:2009年第3周) 谢谢 编辑:如果您只使用Linux机器,请使用cletus的解决方案,不过我正在寻找可以在Windows和Linux上工作的解决方案 您可以使用来获取时间 $time = strptime('1 23 2009', '%w %U %Y'); 这将获得2009年第23周的星期一(第1天,第0天是星期日,第6天是星期六)的时间。如果要将其格式化为日期,请使用 这里有一个非常简单的解决方案,传递一周no并返回
$time = strptime('1 23 2009', '%w %U %Y');
这将获得2009年第23周的星期一(第1天,第0天是星期日,第6天是星期六)的时间。如果要将其格式化为日期,请使用
这里有一个非常简单的解决方案,传递一周no并返回日期 ISO8601标准规定,第一周总是在1月4日的那一周 例如,要在一年中的第4周获得一天,请执行以下操作:
$day_in_week = strtotime("2006-01-04 + 4 weeks"));
然后您可以将该值调整为星期日(作为您可以保证找到的起始位置):
然后,再加上一天中的秒数,得到星期一
$monday_in_week = $sunday_in_week + (60 * 60 * 24);
注意:此方法有时会在夏令时出现一些问题。一种类似的、在DST时间变化之间稍微安全一些的方法将使用。但是,DateTime仅在PHP5.2.0或更高版本中受支持。上述方法也适用于早期版本。另一种解决方案:
<?php
$week = 3;
$year = 2009;
$timestamp = mktime( 0, 0, 0, 1, 1, $year ) + ( $week * 7 * 24 * 60 * 60 );
$timestamp_for_monday = $timestamp - 86400 * ( date( 'N', $timestamp ) - 1 );
$date_for_monday = date( 'Y-m-d', $timestamp_for_monday );
?>
试试这个功能
function MondayOfWeek($WeekNumber, $Year=-1) {
if ($Year == -1) $Year = 0+date("Y");
$NewYearDate = mktime(0,0,0,1,1,$Year);
$FirstMondayDate = 7 + 1 - date("w", mktime(0,0,0,1,1,2009));
$Dates_fromFirstMonday = 7 * $WeekNumber;
$Second_fromFirstMonday = 60*60*24*($FirstMondayDate + $Dates_fromFirstMonday);
$MondayDay_ofWeek = $NewYearDate + $Second_fromFirstMonday;
$Date_ofMondayDay_ofWeek = 0+date("j", $MondayDay_ofWeek);
return $Date_ofMondayDay_ofWeek;
}
for($i = 0; $i
函数MondayOfWeek($WeekNumber,$Year=-1){
如果($Year==-1)$Year=0+日期(“Y”);
$NewYearDate=mktime(0,0,0,1,1,$Year);
$FirstMondayDate=7+1-日期(“w”,mktime(0,0,0,1,12009));
$Dates_fromFirstMonday=7*$WeekNumber;
$Second_fromFirstMonday=60*60*24*($FirstMondayDate+$Dates_fromFirstMonday);
$MondayDay_of Week=$NewYearDate+$Second_fromFirstMonday;
$Date\u of MondayDay\u of week=0+日期(“j”,$MondayDay\u of week);
返回$Date\u of mondayday\u of week;
}
对于($i=0;$i)
跑步时,我得到:
-5-12-19-26-2-9-16-23-2-9-16-23-30-6-13-20-27-4-11-18-25-1-8-15-22-29-6-13-20-27-3-10-17-24-31-7-14-21-28-5-12-19-26-2-9-16-23-30-7-14-21-28
-5-12-19-26-2-9-16-23-2-9-16-23-30-6-13-20-27-4-11-18-25-1-8-15-22-29-6-13-20-27-3-10-17-24-31-7-14-21-28-5-12-19-26-2-9-16-23-30-7-14-21-28
希望这有帮助。似乎正在工作,不依赖于服务器操作系统:
<?php
$week = 4;
$year = 2013;
$timestamp_for_monday = mktime( 0, 0, 0, 1, 1, $year ) + ((7+1-(date( 'N', mktime( 0, 0, 0, 1, 1, $year ) )))*86400) + ($week-2)*7*86400 + 1 ;
?>
我们的想法是增加:
- 所选年份的1月1日的时间戳
- 到达第一周结束的秒数(即7天减去1月1日的星期日+1天)乘以每天的秒数
- 所选周数减去第一周和当前周的秒数
- 1秒到达当前周的第一秒
echo date('M d',strtotime('2013W15'));
其中15是周数。但对于10以下的数字,请确保第一周和第二周的格式为01、02。一个干净的方法是使用php DateTime类
$year = 2015;
$week_no = 1;
$date = new DateTime();
$date->setISODate($year,$week_no);
echo $date->format('d-M-Y');
这将导致:2014年12月29日下一个脚本给出了一年中特定一周的7天
$time = new DateTime();
$time->setISODate(2016, 13);
for($i=0;$i<7;$i++){
echo $time->format('d-M-Y') . '<br />';
$time->add(new DateInterval('P1D'));
}
$time=newdatetime();
$time->setISODate(2016,13);
对于($i=0;$iformat('d-M-Y')。
;
$time->add(新的日期间隔('P1D'));
}
我在java脚本中需要相同的代码。因此我转换了
function(week,year){
var timestamp = new Date(year, 0, 1, 0, 0, 0, 0);
var dateObj=new Date();
var val = timestamp.getTime();
days=( week * 7 * 24 * 60 * 60*1000 );
val=val+days;
var timestamp_for_monday =val - 86400 *((timestamp.getDay()-1000));
var weekdate=new Date(timestamp_for_monday);
return weekdate;
}
是的,在PHP.net页面的注释中说:在Windows上不工作。在PHP>=5.3中,DateTime对象似乎也包含此功能,在Windows上也是如此。这是迄今为止在Linux和Windows平台上最简单的工作解决方案。
date('U',$timestamp)
可以缩短为$timestamp
。根据deceze的建议进行更新。这在前一年第一周的星期一不起作用,例如:$Week=1;$Year=2013。这将是DST更改的一个问题,因为一周不会有86400秒。我认为在PHP5.2或5.1 ei中使用它没有任何问题ther.对我来说效果很好,我想我正在使用5.2.18。感谢这个快捷方式!这个解决方案实际上比dateobject好得多。我发现dateobject在很多情况下都太麻烦了。因此,这是一个好办法!
$time = new DateTime();
$time->setISODate(2016, 13);
for($i=0;$i<7;$i++){
echo $time->format('d-M-Y') . '<br />';
$time->add(new DateInterval('P1D'));
}
function(week,year){
var timestamp = new Date(year, 0, 1, 0, 0, 0, 0);
var dateObj=new Date();
var val = timestamp.getTime();
days=( week * 7 * 24 * 60 * 60*1000 );
val=val+days;
var timestamp_for_monday =val - 86400 *((timestamp.getDay()-1000));
var weekdate=new Date(timestamp_for_monday);
return weekdate;
}