De juiste tijd

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan R

Jan R

26/04/2024 10:20:33
Quote Anchor link
Hoi

Ik slaag er maar niet in om de juiste tijd te hebben in wamp
Alle codes hieronder geven 2u te vroeg aan
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>';
}


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
 
PHP hulp

PHP hulp

22/06/2024 08:10:00
 
- Ariën  -
Beheerder

- Ariën -

26/04/2024 10:55:01
Quote Anchor link
Kijk eens naar date.timezone in php.ini.
 
- SanThe -

- SanThe -

26/04/2024 10:56:14
Quote Anchor link
date_default_timezone_set();
 
Jan R

Jan R

26/04/2024 11:24:36
Quote Anchor link
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
 
Ivo P

Ivo P

26/04/2024 11:36:55
Quote Anchor link
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ë
 
Jan R

Jan R

26/04/2024 11:39:47
Quote Anchor link
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.
Gewijzigd op 26/04/2024 11:41:28 door Jan R
 
Ivo P

Ivo P

26/04/2024 11:40:07
Quote Anchor link
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
 
Jan R

Jan R

26/04/2024 11:48:13
Quote Anchor link
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
Gewijzigd op 26/04/2024 11:50:29 door Jan R
 
Ad Fundum

Ad Fundum

26/04/2024 12:20:27
Quote Anchor link
Dit zou altijd moeten werken (tenzij je de Intl extensie uit hebt staan):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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..
?>
Gewijzigd op 26/04/2024 12:25:03 door Ad Fundum
 
Ivo P

Ivo P

26/04/2024 12:53:52
Quote Anchor link
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


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.
 
- Ariën  -
Beheerder

- Ariën -

26/04/2024 13:14:28
Quote Anchor link
Als de locales met PHP in Windows nog een probleem zijn, dan heb ik hier de juiste set gevonden in mijn sourcecode:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    setlocale(LC_ALL, 'nl_NL', 'nl', 'du', 'dutch');
?>


In Windows krijg ik hiermee netjes de Nederlandse datums qua taal.
 
Ward van der Put
Moderator

Ward van der Put

26/04/2024 13:46:59
Quote Anchor link
Je kunt de DateTimeZone ook meegeven bij het declareren van een DateTime of DateTimeImmutable, bijvoorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

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.
 
Ivo P

Ivo P

26/04/2024 13:51:35
Quote Anchor link
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.
 
Jan R

Jan R

27/04/2024 09:16:33
Quote Anchor link
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.
 
- Ariën  -
Beheerder

- Ariën -

27/04/2024 09:34:21
Quote Anchor link
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.
 
Erwin Leemans

Erwin Leemans

06/05/2024 08:14:54
Quote Anchor link
Zo heb ik het gedaan op mijn site:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
putenv("TZ=Europe/Amsterdam");

$t = date("H");
$m = date("i");

echo "<H2>Het is nu " . $t;
echo "u" .$m;
echo "</H2>";
?>
 
Jan R

Jan R

06/05/2024 10:52:11
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
    function mijntijd($seconden) {
        $s=(int)$seconden;
        $h=(int)($s/3600);
        $s -= $h*3600;
        $m = (int)($s/60);
        $s -= (int)($m*60);
        return str_pad($h, 2, '0', STR_PAD_LEFT) . ':' . str_pad($m, 2, '0', STR_PAD_LEFT) . ':' . str_pad($s, 2, '0', STR_PAD_LEFT);
    }
 
Ad Fundum

Ad Fundum

06/05/2024 14:44:21
Quote Anchor link
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.
Gewijzigd op 06/05/2024 19:25:37 door Ad Fundum
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.