Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Rozpoznanie podanej daty - czas zimowy czy letni, z wykorzystaniem date("I")
jurcio6
post 3.01.2012, 12:51:44
Post #1





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

Ostrzeżenie: (0%)
-----


Witam,

Mam pewien problem - nie mogę zmusić swojego interpretera do rozpoznania podanej mu daty czy jest ona w czasie letnim, czy zimowym...

  1. <?php
  2. if(date("I", strtotime('2011-01-29')) == 0)
  3. echo 'zimowy';
  4. else
  5. echo 'letni';
  6. //zwraca: zimowy
  7.  
  8. if(date("I", strtotime('2011-09-10')) == 0)
  9. echo 'zimowy';
  10. else
  11. echo 'letni';
  12. //zwraca: zimowy
  13.  
  14. ?>


Czemu w obu przypadkach date("I") zwraca 0? Czy jest tam jakiś błąd? Czy istnieje inny sposób rozpoznawania czasu?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
Crozin
post 3.01.2012, 13:00:27
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


DST jest uzależniony od strefy czasowej, a nie w każdej istnieje coś takiego. Sprawdź czy masz ustawione Europe/Warsaw.
Go to the top of the page
+Quote Post
Uriziel01
post 3.01.2012, 13:17:11
Post #3





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


Ustaw po prostu:
  1. date_default_timezone_set('Europe/Warsaw');

Proszę bardzo:)

Ten post edytował Uriziel01 3.01.2012, 13:17:30
Go to the top of the page
+Quote Post
jurcio6
post 3.01.2012, 13:29:50
Post #4





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

Ostrzeżenie: (0%)
-----


Ustawienie strefy nic nie daje - efekt nadal ten sam.

Generalnie to chcę uniknąć manipulowania strefą czasową - chodzi głównie o bazę danych. Przyjąłem dla aplikacji model, w którym dane w bazie zapisywane są w oparciu o jedną strefę czasową przez cały rok bez rozróżniania zimy czy lata. Powód jest oczywisty - uniknięcie dublowania godzin zapisu rekordów (większość tabel gromadzących dane ma potrzebny timestamp) lub braku rekordów z danej godziny podczas zmian czasów. W ten sposób rozróżnienie czasu zrzucam jedną prostą funkcją na skrypty wyświetlające dane, a te, w zależności od tego jaki jest czas, mają tłumaczyć daty (dodawać/odejmować godzinę lub pozostawić datę bez zmian).

Samo date("I") działa poprawnie - kiedy był czas letni, to zwracało letni, kiedy zimowy, to zwraca zimowy, ale ja potrzebuję określić ten czas dla podanej konkretnie daty, a nie dla 'teraz'.

//dodam, iż sprawdzałem skrypt na lokalu jak i na serwerze hostingowym, echo date_default_timezone_get(); odpowiednio zwraca Europe/Warsaw

Ten post edytował jurcio6 3.01.2012, 13:38:36
Go to the top of the page
+Quote Post
benio101
post 3.01.2012, 14:33:16
Post #5





Grupa: Zarejestrowani
Postów: 111
Pomógł: 10
Dołączył: 16.07.2009
Skąd: Toruń

Ostrzeżenie: (0%)
-----


SOA#1

Wklej
  1. <?if(date("I", strtotime('2011-01-29')) == 0)
  2. echo 'zimowy';
  3. else
  4. echo 'letni';
  5. //zwraca: zimowy
  6.  
  7. if(date("I", strtotime('2011-09-10')) == 0)
  8. echo 'zimowy';
  9. else
  10. echo 'letni';
  11. //zwraca: zimowy?>
na np. http://writecodeonline.com/php/
Go to the top of the page
+Quote Post
jurcio6
post 3.01.2012, 14:42:09
Post #6





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

Ostrzeżenie: (0%)
-----


^
tam śmiga dobrze.. pozostaje teraz tylko pytanie: "dlaczego na moim serwerze nie działa"?
Go to the top of the page
+Quote Post
rocktech.pl
post 3.01.2012, 14:45:22
Post #7





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

Ostrzeżenie: (0%)
-----


Witam.

Polecam ten artykuł który w jednej sekcji porusza twój problem.


--------------------
Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. --Brian Moore

I never go looking for a sucker. I look for a Champion and make a sucker of of him. --Amarillo Slim


Home-made : js-gui-classes | Accordion | Tabs | Carousel / php-sms-classes | Obsługa bramki SMS MultiInfo | Obsługa bramki SMS Mobiltek
Go to the top of the page
+Quote Post
Uriziel01
post 3.01.2012, 14:54:14
Post #8





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


Cytat(jurcio6 @ 3.01.2012, 13:29:50 ) *
Ustawienie strefy nic nie daje - efekt nadal ten sam.

Samo date("I") działa poprawnie - kiedy był czas letni, to zwracało letni, kiedy zimowy, to zwraca zimowy, ale ja potrzebuję określić ten czas dla podanej konkretnie daty, a nie dla 'teraz'.


Z całym szacunkiem, nie widzę fizycznej możliwości aby to co mówisz było prawdą. Chcesz mi powiedzieć że interpreter PHP zwraca inny wynik gdy nie podasz mu czasu (czyli 'teraz') a gdy podasz mu te 'teraz' ręcznie ? Oczywiście nikogo nie obrażam, może jedynie nie widzisz czegoś co zmienia się pomiędzy tymi testami.

Ten post edytował Uriziel01 3.01.2012, 14:56:43
Go to the top of the page
+Quote Post
jurcio6
post 3.01.2012, 15:03:03
Post #9





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

Ostrzeżenie: (0%)
-----


Porusza, aczkolwiek nie rozwiązuje.

Z przetrzymywaniem dat w bazie i wyświetlaniem (konwertowaniem w warstwie prezentacji) radzę sobie dokładnie tak, jak jest napisane w artykule. Problem pojawia się aby rozpoznać czy podana data jest w czasie zimowym, czy nie.

Przykład.
Mamy bazę danych z tabelą tab1 i polami a,b,c, gdzie c jest polem typu DateTime w formacie (yyyy-mm-dd hh:mm:ss). Godziny w bazie danych zapisywanie są w UTC. I teraz tak: użytkownik chce wyświetlić dane z przedziału czasu 2011-01-01 10:00:00 - 2011-09-01 10:00:00 i takie też daty wpisze w formularzu. Wobec tego skrypt musi zrobić nam zapytanie - aby było poprawne, od jednej z dat musimy odjąć (lub dodać) godzinę, bo jest w czasie zimowym (letnim - w zależności od aktualnego czasu).

Jedyne, co mi potrzebne w tym momencie, to rozróżnienie w jakim czasie (letnim, czy zimowym) mieści się podana przez użytkownika data. Tylko tyle. Albo aż tyle.

Kolego Uriziel01:
Jakbym widział, to bym nie pisał. Wklejałem wyżej dokładnie taki kod, jaki odpalałem na serwerze, i niezależnie od podanego czasu, wynikiem zawsze jest "zimowy". Pewności 100% również nie mam, czy wcześniej działało dobrze i czy było to na tej samej maszynie/instalacji - po prostu nie pamiętam. Chodzi teraz tylko i wyłącznie o ten wklejony kod i o to czemu na http://writecodeonline.com/php/ działa to poprawnie, a na moim hostingu nie, co może być nie tak?

Ten post edytował jurcio6 3.01.2012, 15:09:34
Go to the top of the page
+Quote Post
rocktech.pl
post 3.01.2012, 15:37:21
Post #10





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

Ostrzeżenie: (0%)
-----


A daj tak.
  1. $dt = new DateTime('2011-01-29');
  2. //odkomentuj
  3. //$dt->setTimeZone(new DateTimeZone('Europe/Warsaw'));
  4.  
  5. echo ($dt->format('I') == 0) ? 'letni' : 'zimowy';
  6.  
  7. $dt = new DateTime('2011-09-10');
  8. //$dt->setTimeZone(new DateTimeZone('Europe/Warsaw'));
  9.  
  10. echo ($dt->format('I') == 0) ? 'letni' : 'zimowy';


I zobacz jak się zachowuje po odkomentowaniu.

Ten post edytował rocktech.pl 3.01.2012, 15:40:50


--------------------
Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. --Brian Moore

I never go looking for a sucker. I look for a Champion and make a sucker of of him. --Amarillo Slim


Home-made : js-gui-classes | Accordion | Tabs | Carousel / php-sms-classes | Obsługa bramki SMS MultiInfo | Obsługa bramki SMS Mobiltek
Go to the top of the page
+Quote Post
jurcio6
post 3.01.2012, 15:40:21
Post #11





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

Ostrzeżenie: (0%)
-----


Ok, teraz stało się coś zupełnie dziwnego, bo nagle wszystko zaczęło działać... Odpaliłem ponownie następujący kod:
  1. echo date_default_timezone_get(); //na localu zwracało mi UTC, na hostingu Europe/Warsaw
  2. date_default_timezone_set('Europe/Warsaw');
  3. echo date_default_timezone_get(); // po ustawieniu w obu wypadkach daje Europe/Warsaw
  4. if(date("I", strtotime('2011-09-10')) == 0)
  5. echo 'zimowy';
  6. else
  7. echo 'letni';
  8. //zwraca letni, czyli dobrze

Wygląda na to, że skrypt nie radził sobie z datą sformatowaną przez date podaną jako argument dla funkcji date, tj.
  1. if(date("I", date("Y-m-d H:i:s", strtotime('2011-09-10'))) == 0)

Nie działał on również przy strefie czasowej ustawionej na UTC oraz GMT.

Dziwi mnie jedynie fakt, że już wcześniej testowałem go w kilku różnych, m.in. w podanych wyżej wariantach.. albo mi coś umknęło, albo póki co działa to to jak chce - na pewno będę się jeszcze przyglądał temu wszystkiemu.

Dzięki za naprowadzenie na temat.

Ten post edytował jurcio6 3.01.2012, 15:48:43
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 17:48