PHP operacje na dacie

0

witam mam problem z napisaniem takiego programu:

Funkcja napisana w PHP ma działać następująco.
Powinna się nazywać whichWeek i posiadać 3 argumenty: $year, $month, $day
Przekazana data do funkcji może być dowolna (z przeszłości, bieżąca lub z przyszłości)
Funkcja ma za zadanie zwrócić numer tygodnia, który obowiązuje w dniu, który został przekazany do funkcji
Tygodnie numerowane są w następujący sposób:
tydzień rozpoczyna się zawsze w czwartek
pierwszy tydzień zaczyna się w pierwszy czwartek marca każdego roku

Przykłady:
Gdy podam datę 01.03.2018 funkcja zwraca 1.
Gdy podam datę 12.03.2018 funkcja zwraca 2.
Gdy podam datę 19.04.2017 funkcja zwraca 7.
Gdy podam datę 27.03.2015 funkcja zwraca 4.
Gdy podam datę 04.03.2019 funkcja zwraca 53.

pomyślałem żeby zrobić operacje na funkcji strtotime nie wiem czy dobrze myslę? Napisałem algorytm który wyświetla numer tygodnia ale zabardzo nie wiem teraz jak zrobic ta numeracje od marca i i czwartku. "%W" domyslnie liczy dni od poniedziałku. Czy mam tam dodać po prostu 3 dni??

<?php


$day   = date('d'); // dzień
$month = date('m'); // miesiąc
$year  = date('Y'); // rok


$WeekNumber = date('W'); // tutaj przekazanie daty
$whichWeek = (strtotime($WeekNumber)); 

// funkcja strtotime jaki mam tutaj zrobic prawidłowy zapis żeby tygodnie liczyło od czwartku i marca każdego roku?

echo 'numer tygodnia:' . $WeekNumber;

?>
0

Podziel sobie problem na kilka:

  1. znaleźć pierwszy tydzień - znaleźć pierwszy czwartek w marcu i od niego zacząć liczenie
  2. szukać każdego kolejnego tygodnia - warto by działać na obiektach DateTime i zrobić diff, który daje Ci dni i tygodnie - jeżeli liczba dni > 0 to liczba tygodni na wyniku = liczba tygodni + 1
0

szczerze mówiąc dalej mi to nie wyjaśnia jak to ma wyglądać. Ktoś ma jakiś pomysł jak to napisać i jakich funkcji uzyc zeby było najlepiej ?

0
PiDev napisał(a):

Google nie boli....
https://stackoverflow.com/questions/9567673/get-week-number-in-the-year-from-a-date-php#answer-9567769

tak widziałem to z twojego linka wcześniej. Natomiast to nie rozwiązuje problemu tego zadania. Nie liczy tygodni od marca i nie zaczyna liczenia tygodnia od czwartku. I co tu oznacza "-" w zapisie explode ????

0

Masz początek :)

	function whichWeek($year, $month, $day) {
		$FirstThursdayOfMarch = strtotime("First Thursday of March ".$year);
	}
0

A może coś takiego że po prostu od miennej w której bedzie data odjąć różnice dni i miesięcy żeby właśnie liczyło od marca i tydzień od czawartku?? Tak jak tu kolega podpowiadał zrobić diff ? Ja się cały czas ucze także wybaczcie jak źle mysle mogą to też być bzdury co zapisuje.

public function whichWeek($FromDate, $ToDate) {
  $FromDate = new DateTime($FromDate); // tutaj włożyc datę z tablicy
  $ToDate   = new DateTime($ToDate); // tutaj wlozyc date z nowym odliczaniem przekształcona strtotime("First Thursday of March ") ???
  $newCalendar = $FromDate->diff($ToDate); 

Coś takiego? A moze jest jakas funkcja ktora by calkowicie umozliwiała od poczatku zmiane numeracji?? W manualu date() ma atrybut W liczy tygodnie od poniedzialku moze po prostu da sie mu zmienic jakos numeracje? Nie wiem może ma ktoś pomysł jak to rozwiązać na stacku i google nie znalazłem.

1

Dobra już sobie nie komplikuj. Widzę, że kompletnie nie rozumiesz tego... do wykonania spokojne Ci wystarczy date i strtotime.
strtotime ma zmienną $year bo chcesz sprawdzać pierwszy czwartek marca dla danego roku. Bez roku pobierz jedynie pierwszy czwartek marca dla br.

    function whichWeek($year, $month, $day) {
        $FirstThursdayOfMarch = strtotime("First Thursday of March ".$year); 
        $date = strtotime("{$year}/{$month}/{$day}");

        /* za pomocą date() sobie wyciągnij i poobliczaj */
    }
0
    function whichWeek($year, $month, $day) {
        $FirstThursdayOfMarch = strtotime("First Thursday of March ".$year); 
        $date = strtotime("{$year}/{$month}/{$day}");

		$week0 = date("W",$FirstThursdayOfMarch);
		$week1 = date("W",$date);
		
		if($week0 <= $week1) {
			$week = ($week1-$week0)+1;
		} else {
			$week = 53-($week0-$week1);
		}
		
		return ($week<10?"0".$week:$week);
	}
	
0

Na wstępie chciałem podziękować koledze PiDev za cierpliwość. I naprowadzenie jak to w ogóle matematycznie zrobić. Niestety powyższy program mi nie działa raczej na pewno coś zle robie... Teraz chce wklepać przykładową datę z zadania (np 27.03.2015 funkcja powinna zwrócić 4.) chyba jakoś zle ustawiam te zmienne. I zle wywołuje funkcje. Kto mi powie co tu jest nie tak? Sorry jeszcze raz jak są duże bzdury w zapisie ale się uczę. Dlaczego poniższa funkcja mi się nie wyświetla? Czy date jakos inaczej dodać za pomocą jakiegoś np new DateTime("27.03.2015); ??

<?php

/**
* 
*/
class calendar {

	 public $year;
	 public $month;
	 public $day;

	function __construct(){

            $this->year = "2015";
            $this->month = "03";
            $this->day = "27";
      }
	
function whichWeek($year, $month, $day) {
        $FirstThursdayOfMarch = strtotime("First Thursday of March ".$year); 
        $date = strtotime("{$year}/{$month}/{$day}");

        $week0 = date("W",$FirstThursdayOfMarch);
        $week1 = date("W",$date);

        if($week0 <= $week1) {
            $week = ($week1-$week0)+1;
        } else {
            $week = 53-($week0-$week1);
        }

        return ($week<10?"0".$week:$week);
        echo $week;
    }
}

    $NewWeek = new calendar();

    $NewWeek -> whichWeek();  
?>

```php
0

Błąd 1. Brak parametrów dla funkcji whitchWeek !
Błąd 2. return zatrzymuje Ci funkcję i zwraca wartość (ale nie ma gdzie jej wyświetlić).
echo daj sobie przed wywoływaną funkcją.

Nie prościej będzie ustawić parametry dla klasy niż klepać je w __costruct ?
Potem tylko wywołujesz klasę (z parametrami), funkcję bez parametrów i gotowe.

0
class calendar {

	 public $year;
	 public $month;
	 public $day;

	function __construct(){

            $this->year = "2015";
            $this->month = "03";
            $this->day = "27";
      }
	
function whichWeek($year, $month, $day) {

        $FirstThursdayOfMarch = strtotime("First Thursday of March ".$year); 
        $date = strtotime("{$year}/{$month}/{$day}");

        $week0 = date("W",$FirstThursdayOfMarch);
        $week1 = date("W",$date);

        if($week0 <= $week1) {
            $week = ($week1-$week0)+1;
        } else {
            $week = 53-($week0-$week1);
        }

        echo $week;
        return ($week<10?"0".$week:$week);
        
    }
}

	$year = "2015";
 	$month = "03";
	$day = "27";

    $newWeek = new calendar();

    $newWeek->whichWeek($year, $month, $day);

zadziałało mi tak jeszcze raz wielkei dzieki PiDev. Mam jeszcze pytanie czy tutaj jak wywale ten konstruktor to czy on jest jakos niezbedny ? czy moglbym tutaj uzyc np get i set i wkładać jakieś losowe dane? Wtedy co w wartości zmiennych wklepać np $year=null; ??

1 użytkowników online, w tym zalogowanych: 0, gości: 1