简体   繁体   English

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

[英]How to get the first day of a given week number in PHP (multi-platform)?

What is the simplest way to do it in PHP ? 在PHP中最简单的方法是什么?

I want the date of the Monday of a given week number of a year (example : week number 3 of 2009) 我想要一周给定周数的星期一日期(例如:2009年第3周)

Thanks ! 谢谢 !

EDIT : If you use Linux only machines, use cletus' solution, however I am looking for something that can work on Windows AND Linux. 编辑:如果你只使用Linux机器,使用cletus的解决方案,但我正在寻找可以在Windows和Linux上工作的东西。

It's simple on PHP 5.3 它在PHP 5.3上很简单

echo date('M d',strtotime('2013W15'));

where 15 is the number of week. 其中15是周数。 But for the number below ten make sure it is in the format of 01, 02 for first week and second week. 但对于低于10的数字,请确保第一周和第二周的格式为01,02。

Yet another solution: 又一个解决方案:

<?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 );
?>

A nice way to get this in a clean way is by using php DateTime class. 以一种干净的方式获得它的一个好方法是使用php DateTime类。

$year = 2015;
$week_no = 1;

$date = new DateTime();
$date->setISODate($year,$week_no);
echo $date->format('d-M-Y'); 

This would result into : 29-12-2014 这将导致:29-12-2014

You can use strptime() to get the time. 您可以使用strptime()来获取时间。

$time = strptime('1 23 2009', '%w %U %Y');

This will get the time for the Monday (day 1, 0 is Sunday, 6 is Saturday) of the 23rd week of 2009. If you want to format this into a date, use date() . 这将获得2009年第23周的星期一(第1天,第0天是星期日,6星期六)的时间。如果要将其格式化为日期,请使用date()

$date = date('d F Y', $time);

Seems to be working and not dependent of the server OS : 似乎工作而不依赖于服务器操作系统:

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

?>

the idea is to add : 想法是添加:

  • the timestamp of the first of January of the chosen year 所选年份的1月1日的时间戳
  • the number of seconds to reach the end of the first week (which is 7 days minus the day of week of the 1st of January + 1 day) multiplied by the number of seconds per day 到达第一周结束的秒数(即7天减去1月1日的一周+ 1天)乘以每天的秒数
  • the number of seconds of the number of chosen weeks minus the first week and the current week 所选周数减去第一周和当前周的秒数
  • 1 second to reach the fist second of the current week 1秒钟到达本周的第二个秒

My example returns : 1358722801 which is the timestamp of 2013/01/21 0:00:01 我的示例返回:1358722801,这是2013/01/21 0:00:01的时间戳

This next script gives the 7 days of an specific week of a year 下一个脚本给出了一年中特定周的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'));
}

Here is very simple solution, passing a week no and returns the date. 这是一个非常简单的解决方案,通过一周没有并返回日期。

The ISO8601 standard states that week 1 always fall on the week where Jan 4 falls. ISO8601标准规定第1周总是落在1月4日下降的那一周。

For example, to get a day in the 4th week of the year: 例如,要获得一年中第4周的一天:

$day_in_week = strtotime("2006-01-04 + 4 weeks"));

Then you can adjust this value to Sunday (as a starting place you can guarantee that you can find): 然后你可以将这个值调整为星期日(作为起始点,你可以保证你可以找到):

// Find that day's day of the week (value of 0-6)
$wday = date('w', $day_in_week);
$offset = 6 - $wday; // How far it is from Sunday.
$sunday_in_week = $day_in_week - ($offset * (60 * 60 * 24)); // $offset * seconds in a day

Then, you add the seconds in a day again to get Monday. 然后,再次添加一天中的秒数以获得星期一。

$monday_in_week = $sunday_in_week + (60 * 60 * 24);

Note: This method can occasionally have some problems with daylight savings time. 注意:此方法偶尔会遇到夏令时问题。 A similar, and slightly safer between DST time changes, method would use the DateTime class . 在DST时间更改之间类似且稍微安全一些,方法将使用DateTime类 However, DateTime is only support in PHP 5.2.0 or later. 但是,DateTime仅支持PHP 5.2.0或更高版本。 The method above works in earlier version as well. 上述方法也适用于早期版本。

Try this function 试试这个功能

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 

When run, I got:

-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

Hope this helps. 希望这可以帮助。

I required same in the java script..so i converted. 我在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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM