如何在PHP(多平台)中获取给定周数的第一天?

如何在PHP(多平台)中获取给定周数的第一天?,php,Php,在PHP中最简单的方法是什么 我想要一年中给定周数的星期一的日期(例如:2009年第3周) 谢谢 编辑:如果您只使用Linux机器,请使用cletus的解决方案,不过我正在寻找可以在Windows和Linux上工作的解决方案 您可以使用来获取时间 $time = strptime('1 23 2009', '%w %U %Y'); 这将获得2009年第23周的星期一(第1天,第0天是星期日,第6天是星期六)的时间。如果要将其格式化为日期,请使用 这里有一个非常简单的解决方案,传递一周no并返回

在PHP中最简单的方法是什么

我想要一年中给定周数的星期一的日期(例如:2009年第3周)

谢谢

编辑:如果您只使用Linux机器,请使用cletus的解决方案,不过我正在寻找可以在Windows和Linux上工作的解决方案

您可以使用来获取时间

$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秒到达当前周的第一秒
我的示例返回:1358722801 这是2013/01/21 0:00:01的时间戳,在PHP5.3上很简单

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;
}