Porównanie dat i ich wyświetlenie

0

Cześć
To daty w pliku.

14^55^00^21^08^2018--19^00^00^21^08^2018
08^55^00^21^08^2018--14^00^00^21^08^2018
14^05^00^11^08^2018--19^00^00^12^08^2018
05^00^00^21^08^2018--17^00^00^21^08^2018
(...)

godzina^minuta^sekunda^dzien^miesiac^rok. Zawsze w linii sa dwie daty jakby "od-do".Daty mogą mieć różne dni ale miesiace te same.

Zalóżmy że jest dzisiaj 21 sierpnia 6 rano czyli

06^00^00^21^08^2018

a data "do"

15^00^00^21^08^2018

Chodzii o to żeby wyswietlić wszystkie linie nie z pomiędzy tyc dat ale te ktore są "dzisiaj" a poczatkowa wartosc MUSI byc "wczesniej niz pierwsza data(ale musi to byc "dzisiaj" ) a to "do" ta druga. Maksymalnie. Inne nie brane pod uwage. Jesli pierwsza wartosc bedzie rowna aktualnej to nie wyswietlac.
Problem w tym ze nie wiem jak sprawdzic czy to jest dzisiaj. Przekonwertowując na timestamp sprawdzic moge tak:

if(($pierwsza > time()) && ($druga > time()))
{
// oi
}

Tylko że ten przyklad wyświetli mi daty wszystkie "sprzed" pierwszej daty.

1

Użyj operatora
>=(większe lub równe) zamiast >(większe).
Analogicznie jeżeli byśmy chcieli zrobić to samo przy maksymalnej.

0

explode do rozbicia stringa na tablicę elementów, potem już z górki za pomocą wbudowanego DateTime albo https://carbon.nesbot.com/.

3
  1. Pisz JAŚNIEJ...
  2. Najprostsze sprawdzanie...
if(date('Ymd', $pierwsza) === date('Ymd')) { //sprawdzamy czy pierwsza data jest równa dzisiejszej dacie
}
<?php
// Zamiana dat na czas UNIXowy
function date2unix(String $dateString) {
	if(preg_match("/^([0-9]{2})\^([0-9]{2})\^([0-9]{2})\^([0-9]{2})\^([0-9]{2})\^([0-9]{4})$/i", $dateString, $time)) {
		return mktime($time[1], $time[2], $time[3], $time[5], $time[4], $time[6]);
	} else {
		return 0;
	}
}

// Pobieramy daty
$dates = file_get_contents('daty.txt');

// Plik dzielimy na linie
foreach(explode("\n", $dates) as $date) {
// Linie na daty
 list($date1, $date2) = explode("--",trim($date),2);
	// Sprawdzamy czy data jest dzisiejsza
	if((date('Ymd',date2unix($date1)) === date('Ymd')) OR (date('Ymd',date2unix($date2)) === date('Ymd'))) {
		echo $date1." - ".$date2."<br>";
	}
}
?>
2

@PiDev: nie ma konieczności używania wyrażenia regularnego do zamiany tego ciągu na datę. PHP ma już to ogarnięte:

$dataStr = '08^55^00^21^08^2018';
$date = DateTime::createFromFormat('H^i^s^d^m^Y', $dateStr)

Możemy tutaj podać dowolny format, nawet jakby data była oddzielona jakimiś bzdurnymi znakami (tak jak w tym wypadku). Musimy tylko w odpowiednie miejsca wstawić odpowiednie znaki, które reprezentują konkretny element daty.


Do wczytania pliku możemy użyć

$rows = file('data.txt', FILE_IGNORE_NEW_LINES);

Dzięki czemu nie musimy tworzyć dodatkowej pętli.


Same daty również bym najpierw zmapował przy użyciu array_map, ponieważ zwiększa to czytelność:

$dates = array_map(function ($row) {
	list($fromDateStr, $toDateStr) = explode('--', $row);

	return [
		'from' => DateTime::createFromFormat('H^i^s^d^m^Y', $fromDateStr),
		'fo' => DateTime::createFromFormat('H^i^s^d^m^Y', $toDateStr)
	];
}, $rows);

Reszta spoko :)

0

Niestety to nie działa.

Chodzii o to żeby wyswietlić wszystkie linie nie z pomiędzy tyc dat ale te ktore są "dzisiaj" a poczatkowa wartosc MUSI byc "wczesniej niz pierwsza data(ale musi to byc "dzisiaj" ) a to "do" ta druga. Maksymalnie. Inne nie brane pod uwage. Jesli pierwsza wartosc bedzie rowna aktualnej to nie wyswietlac.

Czyli jak w pliku jest "dziesiąta zero zero" a aktualna godzina nie przekroczyła tej w pliku to żeby była brana pod uwage i wyświetlona. inne juz nie. Ta godzina nie jest stała bo może to być zarówno 11, 17 czy 22:45. Data czyli dzien i miesiac i rok muszą się zgadzaćz aktualną.

Teraz jest poównywanie dat względem roku-miesiaca-dnia a mnie chodzi o cos innego. Zreszta niewazne. Dzieki za próby.

2

@wesoly_pogrzeb: pomogliśmy Ci:

  • pobrać dane z pliku do tablicy
  • zamienić Twój format na obiekt DateTime
  • zmapować wszystkie daty na obiekty DateTIme

Pozostało Ci dopisać warunek, o którym mówisz. Zamień dokładnie to co mówisz na program! Wystarczy, że zamiast swoich słów w języku polskim użyjesz zmiennych $from, $to oraz $now, zamiast większe, równe mniejsze użyjesz >, =, <, a zamiast i, lub użyjesz && albo ||.

<?php

$now = new DateTime();
$rows = file('test.txt', FILE_IGNORE_NEW_LINES);

$dateRanges = array_map(function ($row) {
	list($fromDateStr, $toDateStr) = explode('--', $row);

	return [
		'from' => DateTime::createFromFormat('H^i^s^d^m^Y', $fromDateStr),
		'fo'   => DateTime::createFromFormat('H^i^s^d^m^Y', $toDateStr),
	];
}, $rows);

$filteredDates = array_filter($dateRanges, function ($dateRange) use ($now) {
	/** @var DateTime $from */
	$from = $dateRange['from'];
	/** @var DateTime $to */
	$to = $dateRange['to'];

	// Jesli pierwsza wartosc bedzie rowna aktualnej
	if ($from === $now) {
		return false; // to nie wyswietlac.
	}

	// poczatkowa wartosc MUSI byc "wczesniej niz pierwsza data(ale musi to byc "dzisiaj" ) a to "do" ta druga.
	//if (tutaj wpisz swój warunek) {
	//	 return true; // to wyświetlaj.
	//}
	
	return false;
});
0

Czasami nie mysle logicznie.. Dziala dziekuję
Zrobiłem nieco po swojemu. Uzyłem pętli, list(), explode{} i time()

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