De juiste tijd
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();
date('H:i:s', 13) ==> 01:00:13. Hoe kan 13 seconden een uur zijn
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ë
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
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
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
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.
In Windows krijg ik hiermee netjes de Nederlandse datums qua taal.
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.
OP een paar extra weken komt het niet aan. 't is al jaren verkeerd.
Je kan het ook in PHP defineeren. Dat is weer handig als je deze in je webapplicatie instelbaar wilt maken.
(nu-start)/gemiddelde duur per stuk * aantal stuks = eindtijd. Dat is geen probleem. De weergave wel dus zelf maar nieuwe functie gemaakt
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.
Wat je nodig heb is wat men algemeen verstaat onder een 'Interval'. Naast 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.