De juiste tijd
Hoi
Ik slaag er maar niet in om de juiste tijd te hebben in wamp
Alle codes hieronder geven 2u te vroeg aan
En ja ik vond dit https://www.phphulp.nl/php/script/snippets/setlocale-nl/1386/setlocalenl/1003/ maar werkt ook niet
Veel sites zeggen gebruik strftime maar dat werkt niet meer.
Hoe krijg ik zowel in de winter als in de zomer de juiste tijd? Liefst de Belgische. Je weet maar nooit dat Be of NL de winter- of zomertijd afschaft en de andere niet :)
Jan
PHP Version 8.3
Ik slaag er maar niet in om de juiste tijd te hebben in wamp
Alle codes hieronder geven 2u te vroeg aan
Code (php)
1
2
3
4
2
3
4
//werken gelemaal niet 'nl_BE', 'nl_NL', 'nl_NL.ISO8859-1', 'fr_FR.UTF-8',
foreach(array('', 'fra', 'Dutch_Belgium', 'nld_Bel.utf-8', 'Dutch_Netherlands', 'Dutch', 'nl', 'nld_NLD') as $l) {
echo $l . '<br>' . setlocale(LC_ALL, $l) . date('d/m/Y H:i:s') . '<hr>';
}
foreach(array('', 'fra', 'Dutch_Belgium', 'nld_Bel.utf-8', 'Dutch_Netherlands', 'Dutch', 'nl', 'nld_NLD') as $l) {
echo $l . '<br>' . setlocale(LC_ALL, $l) . date('d/m/Y H:i:s') . '<hr>';
}
En ja ik vond dit https://www.phphulp.nl/php/script/snippets/setlocale-nl/1386/setlocalenl/1003/ maar werkt ook niet
Veel sites zeggen gebruik strftime maar dat werkt niet meer.
Hoe krijg ik zowel in de winter als in de zomer de juiste tijd? Liefst de Belgische. Je weet maar nooit dat Be of NL de winter- of zomertijd afschaft en de andere niet :)
Jan
PHP Version 8.3
Kijk eens naar date.timezone in php.ini.
date_default_timezone_set();
Ok Bedankt. De weergave is juist maar de berekeningen niet :(
date('H:i:s', 13) ==> 01:00:13. Hoe kan 13 seconden een uur zijn
date('H:i:s', 13) ==> 01:00:13. Hoe kan 13 seconden een uur zijn
0 is waar we beginnen te tellen op 1 januari 1970.
Naar ik aanneem de tijd in Greenwich (London).
Wij lopen een uur voor op GMT (wintertijd, sowieso hadden we toen nog geen zomer/wintertijd).
dus 13 staat voor "13 seconden in het nieuwe jaar 1970 in London"
Dat was dus inmiddels iets na 1 uur 's nachts in Nederland en België
Naar ik aanneem de tijd in Greenwich (London).
Wij lopen een uur voor op GMT (wintertijd, sowieso hadden we toen nog geen zomer/wintertijd).
dus 13 staat voor "13 seconden in het nieuwe jaar 1970 in London"
Dat was dus inmiddels iets na 1 uur 's nachts in Nederland en België
Zoiets dacht ik al.
En daarom begon ik dus met setlocale gevolgd dus nu door date_default_timezone_set
Ik wil dus juiste berekeningen en juiste weergaven.
Ik heeft de start, huidige/eindtijd weer en hieruit bereken ik de duur van een lang process.
En daarom begon ik dus met setlocale gevolgd dus nu door date_default_timezone_set
Ik wil dus juiste berekeningen en juiste weergaven.
Ik heeft de start, huidige/eindtijd weer en hieruit bereken ik de duur van een lang process.
Gewijzigd op 26/04/2024 11:41:28 door Jan R
leesvoer:
https://en.wikipedia.org/wiki/Unix_time
en
https://en.wikipedia.org/wiki/Coordinated_Universal_Time (als opvolger van "gmt", greenwich mean time)
Toevoeging op 26/04/2024 11:41:55:
maar ik zou liever niet met seconden gaan rekenen maar bij al je tijdstippen opgeven om welke tijd het in welke tijdzone gaat.
Alles omrekenen naar seconden sinds 1970 in de tijdzone van Engeland, UTC is een zekerheid voor problemen
https://en.wikipedia.org/wiki/Unix_time
en
https://en.wikipedia.org/wiki/Coordinated_Universal_Time (als opvolger van "gmt", greenwich mean time)
Toevoeging op 26/04/2024 11:41:55:
maar ik zou liever niet met seconden gaan rekenen maar bij al je tijdstippen opgeven om welke tijd het in welke tijdzone gaat.
Alles omrekenen naar seconden sinds 1970 in de tijdzone van Engeland, UTC is een zekerheid voor problemen
Snap ik (meeste toch) maar hoe reken ik dan juist? Ik kan toch moeilijk zelf php gaan herschrijven. Ik kan wel 3600 seconden aftrekken en na 6 maand er 7200 van maken en zo elke jaar te wisselen. Niet echt handig.
Ik denk ook dat 13 seconden in Londen hetzelfde is als hier BE en NL dus 00:00:13
Ik denk ook dat 13 seconden in Londen hetzelfde is als hier BE en NL dus 00:00:13
Gewijzigd op 26/04/2024 11:50:29 door Jan R
Dit zou altijd moeten werken (tenzij je de Intl extensie uit hebt staan):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
// zie: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
$tijdzone = IntlTimeZone::createTimeZone("Europe/Brussels");
$locale = "nl_BE";
// "The calendar created will represent the time instance at which it was created, based on the system time."
$kalender = IntlCalendar::createInstance($tijdzone, $locale);
// zie: https://unicode-org.github.io/icu/userguide/format_parse/datetime/
$format = "dd/MM/yyyy HH:mm:ss";
$formatter = IntlDateFormatter::create($locale, IntlDateFormatter::FULL,
IntlDateFormatter::FULL, $tijdzone, $kalender, $format);
print $formatter->format($kalender); // geen idee waarom je $kalender 2x moet opgeven..
?>
// zie: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
$tijdzone = IntlTimeZone::createTimeZone("Europe/Brussels");
$locale = "nl_BE";
// "The calendar created will represent the time instance at which it was created, based on the system time."
$kalender = IntlCalendar::createInstance($tijdzone, $locale);
// zie: https://unicode-org.github.io/icu/userguide/format_parse/datetime/
$format = "dd/MM/yyyy HH:mm:ss";
$formatter = IntlDateFormatter::create($locale, IntlDateFormatter::FULL,
IntlDateFormatter::FULL, $tijdzone, $kalender, $format);
print $formatter->format($kalender); // geen idee waarom je $kalender 2x moet opgeven..
?>
Jan R op 26/04/2024 11:48:13:
Ik denk ook dat 13 seconden in Londen hetzelfde is als hier BE en NL dus 00:00:13
Ik denk ook dat 13 seconden in Londen hetzelfde is als hier BE en NL dus 00:00:13
die 13 in Date('xyz', 13); staat niet voor zo maar 13 seconden, maar 13 seconden sinds het in Greenwich 1 januari 1970 werd.
dus ook voor het in Nederland etc 01:00 werd op die 1 januari 1970.
Als je een zeker tijdstip hebt, kun je gewoon
$date = new DateTime('2024-04-26 12:52');
doen, mits je vooraf je timezone juist hebt gezet.
Als je bedoelt dat dit een tijdstip betreft waarop in New York iets gebeurt, dan is het handig om de betreffende tijdszone daarbij mee te geven.
Wil je er een uur bij optellen:
$date->modify('+1 hour');
En dat houdt dan ook direct rekening met de overgang van zomer en wintertijd.
Maar ga niet zelf in seconden zitten tellen.
Als de locales met PHP in Windows nog een probleem zijn, dan heb ik hier de juiste set gevonden in mijn sourcecode:
In Windows krijg ik hiermee netjes de Nederlandse datums qua taal.
In Windows krijg ik hiermee netjes de Nederlandse datums qua taal.
Je kunt de DateTimeZone ook meegeven bij het declareren van een DateTime of DateTimeImmutable, bijvoorbeeld:
De tijdzone geldt dan uitsluitend voor deze specifieke DateTime, zodat je niet meer afhankelijk bent van de configuratie.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
declare(strict_types=1);
$now = new \DateTimeImmutable('now', new \DateTimeZone('Europe/Brussels'));
?>
declare(strict_types=1);
$now = new \DateTimeImmutable('now', new \DateTimeZone('Europe/Brussels'));
?>
De tijdzone geldt dan uitsluitend voor deze specifieke DateTime, zodat je niet meer afhankelijk bent van de configuratie.
of, je went je aan om altijd die timezone mee te geven, om niet afhankelijk te zijn van een admin die ineens bij een update de timezone niet bijwerkt, of dat bij een verhuizing naar een andere server alles omvalt.
OK allen bedankt. Nog even alles goed doornemen en ik zie wel hoe ik het doe:)
OP een paar extra weken komt het niet aan. 't is al jaren verkeerd.
OP een paar extra weken komt het niet aan. 't is al jaren verkeerd.
Je kan de tijdzone in php.ini kwijt, als je de tijdzone globaal wilt gebruiken. php.ini werkt ook vaak als extensie per virtualhost op een server.
Je kan het ook in PHP defineeren. Dat is weer handig als je deze in je webapplicatie instelbaar wilt maken.
Je kan het ook in PHP defineeren. Dat is weer handig als je deze in je webapplicatie instelbaar wilt maken.
Zo heb ik het gedaan op mijn site:
Dat is een weergave :). Geen berekening. IK moet start en nu van elkaar aftrekken en zo de voorziene eindtijd berekenen
(nu-start)/gemiddelde duur per stuk * aantal stuks = eindtijd. Dat is geen probleem. De weergave wel dus zelf maar nieuwe functie gemaakt
(nu-start)/gemiddelde duur per stuk * aantal stuks = eindtijd. Dat is geen probleem. De weergave wel dus zelf maar nieuwe functie gemaakt
Wat je nodig heb is wat men algemeen verstaat onder een 'Interval'. Naast DateInterval heeft PHP gelukkig de Intl -extensie (zie mijn vorige post) de juiste berekeningen via IntlCalendar::fieldDifference().
Daarna hoef je alleen de formatting nog zelf te regelen met str_pad().
Gezien dat je data toch meestal in een database zit kan je ook de database gebruiken voor berekeningen.
PostgreSQL kent bijvoorbeeld ook gewoon het datatype interval. Als je je database in de juiste locale hebt staan hoef je niet eens meer zelf een formatting-functie te maken.
Daarna hoef je alleen de formatting nog zelf te regelen met str_pad().
Gezien dat je data toch meestal in een database zit kan je ook de database gebruiken voor berekeningen.
PostgreSQL kent bijvoorbeeld ook gewoon het datatype interval. Als je je database in de juiste locale hebt staan hoef je niet eens meer zelf een formatting-functie te maken.




