Как получить номер первого дня данной недели в PHP (мультиплатформенный)? - PullRequest
9 голосов
/ 02 ноября 2009

Какой самый простой способ сделать это в PHP?

Я хочу указать дату понедельника данной недели в году (например, 3-я неделя 2009 года)

Спасибо!

РЕДАКТИРОВАТЬ: Если вы используете машины только с Linux, используйте решение Cletus, однако я ищу что-то, что может работать на Windows И Linux.

Ответы [ 9 ]

45 голосов
/ 23 апреля 2013

Это просто на PHP 5.3

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

, где 15 - номер недели. Но для числа ниже десяти убедитесь, что оно в формате 01, 02 для первой недели и второй недели.

11 голосов
/ 02 ноября 2009

Еще одно решение:

<?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 );
?>
5 голосов
/ 26 января 2015

Хороший способ получить это в чистом виде - использовать класс php DateTime.

$year = 2015;
$week_no = 1;

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

Это приведет к: 29-12-2014

3 голосов
/ 02 ноября 2009

Вы можете использовать strptime(), чтобы узнать время.

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

Это даст время для понедельника (день 1, 0 - воскресенье, 6 - суббота) 23-й недели 2009 года. Если вы хотите отформатировать это в дату, используйте date() .

$date = date('d F Y', $time);
1 голос
/ 24 октября 2016

Этот следующий скрипт дает 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'));
}
1 голос
/ 22 января 2013

Кажется, что работает и не зависит от ОС сервера:

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

?>

Идея состоит в том, чтобы добавить:

  • отметка времени первого января выбранного года
  • количество секунд до конца первой недели (7 дней минус день недели 1 января + 1 день), умноженное на количество секунд в день
  • количество секунд числа выбранных недель минус первая неделя и текущая неделя
  • 1 секунда для достижения первой секунды текущей недели

Мой пример возвращает: 1358722801 которая является меткой времени 2013/01/21 0:00:01

0 голосов
/ 29 ноября 2018

Мне нужно то же самое в сценарии 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;
}
0 голосов
/ 02 ноября 2009

Попробуйте эту функцию

<code>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 

При запуске я получил:

-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
</code>

Надеюсь, это поможет.

0 голосов
/ 02 ноября 2009

Вот очень простое решение, минуя неделю и возвращает дату.

Стандарт ISO8601 гласит, что неделя 1 всегда приходится на неделю, на которую приходится 4 января.

Например, чтобы получить день на 4-й неделе года:

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

Затем вы можете настроить это значение на воскресенье (в качестве отправной точки вы можете гарантировать, что сможете найти):

// 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

Затем вы снова добавляете секунды в день, чтобы получить понедельник.

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

Примечание: Этот метод может иногда иметь некоторые проблемы с переходом на летнее время. Аналогичный и немного более безопасный метод изменения времени перехода на летнее время будет использовать класс DateTime . Однако DateTime поддерживается только в PHP 5.2.0 или новее. Описанный выше метод работает и в более ранней версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...