[PHP] Dagen en weekends berekenen tussen data

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • bython
  • Registratie: Mei 2012
  • Laatst online: 24-08 09:01
Mijn vraag

Momenteel vragen wij ons verlof nog op papier, nu werd er aan mij gevraagd of ik dit niet kon 'digitaliseren'.
Tot nu toe lukt het meeste wel, maar ik krijg de dagen en weekends maar niet uitgerekend. Oftewel krijg ik verkeerde data terug oftewel een witte pagina.

De gebruiker vult dit als data in:

Datum van: 01/05/2017
Datum tot: 20/05/2017

Relevante software en hardware die ik gebruik

PHP5+
Webhosting

Wat ik al gevonden of geprobeerd heb

Dit is de code die ik momenteel heb, en als ik bijvoorbeeld die datums invul krijg ik een witte pagina, waarschijnlijk is het formaat niet goed, maar ik krijg nergens gevonden hoe ik dit in het juiste formaat krijg.

Ik wil echter enkel de dagen en weekends te zien krijgen, in plaats van maanden en jaren.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// check Vacation request
if (!empty($_POST['btnVacation'])) {


$datetime1 = new DateTime($_POST['event-start-date']);

$datetime2 = new DateTime($_POST['event-end-date']);

$difference = $datetime1->diff($datetime2);

echo 'Difference: '.$difference->y.' jaren, ' 
                   .$difference->m.' maanden, ' 
                   .$difference->d.' dagen';





}


Alvast bedankt! _/-\o_

Alle reacties


Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
bython schreef op vrijdag 23 juni 2017 @ 20:32:
[...]

Dit is de code die ik momenteel heb, en als ik bijvoorbeeld die datums invul krijg ik een witte pagina, waarschijnlijk is het formaat niet goed, maar ik krijg nergens gevonden hoe ik dit in het juiste formaat krijg.

[...]
Dan krijg je dus een error zonder dat je error_reporting aan hebt staan. [google=php enable errors on page]

En als je dan toch aan het Googlen bent: [google=php get weekends between two dates] :P

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • bython
  • Registratie: Mei 2012
  • Laatst online: 24-08 09:01
PHP:
1
error_reporting(E_ALL);


Staat al aan, ik krijg wel output (menu e.d) maar voor de rest een witte pagina zonder foutmelding...

Ik verwacht geen voorgekauwd antwoord, maar een duwtje in de goede richting zou mij al veel helpen.
De datum/tijd modules in PHP zijn nogal verwarrend als je niet hun standaard datum formaat gebruikt.

[ Voor 42% gewijzigd door bython op 23-06-2017 21:06 ]


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 05-10 19:42
PHP:
1
2
3
4
5
6
7
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
$days = $start->diff($end, true)->days;

$sundays = intval($days / 7) + ($start->format('N') + $days % 7 >= 7);

echo $sundays;


Aan jou of je wilt checken op volledige weekenden (dus zaterdag en zondag) of dat je alleen wilt kijken hoeveel zondagen er tussen een periode zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

bython schreef op vrijdag 23 juni 2017 @ 20:49:
Staat al aan, ik krijg wel output (menu e.d) maar voor de rest een witte pagina zonder foutmelding...
Probeer ini_set('display_errors', 1); dan ook even...

Acties:
  • +1 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

RedHat schreef op vrijdag 23 juni 2017 @ 21:45:
PHP:
1
2
3
4
5
6
7
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
$days = $start->diff($end, true)->days;

$sundays = intval($days / 7) + ($start->format('N') + $days % 7 >= 7);

echo $sundays;


Aan jou of je wilt checken op volledige weekenden (dus zaterdag en zondag) of dat je alleen wilt kijken hoeveel zondagen er tussen een periode zijn.
Let op dat DateInterval het tijdsverschil opdeelt in jaren, maanden, dagen, etc net naar gelang hoe groot het tijdsverschil is. Als je alleen het totaal aantal dagen verschil wil weten zul je DateInterval->format('%a') moeten gebruiken.
Darn, niet goed gelezen. De property DateInterval->days is het totaal aantal dagen en DateInterval->d is onderdeel van het opgesplitste tijdsverschil :X

In development is het gebruikelijk om deze twee regels te hebben (zoals hierboven al aangehaald):
PHP:
1
2
error_reporting(-1);
ini_set('display_errors', 1);

Tip: zet de php-xdebug module aan voor gedetailleerdere debug output.

Ik zie dat je direct de $_POST parameters in DateTime stopt. De ctor kan een exception gooien wanneer het argument ongeldig is. Je zou een try/catch block toe kunnen voegen om foutieve input af te handelen.

[ Voor 19% gewijzigd door Bee.nl op 23-06-2017 22:34 ]


Acties:
  • 0 Henk 'm!

  • bython
  • Registratie: Mei 2012
  • Laatst online: 24-08 09:01
@RedHat

Bedankt!

@Bee.nl

Bedankt hier kan ik wat mee!

Nu heb ik de error reporting aanstaan en het volgende veranderd:

PHP:
1
2
3
4
5
6
7
$datetime1 = new DateTime($_POST['event-start-date']);

$datetime2 = new DateTime($_POST['event-end-date']);

$difference = $datetime1->diff($datetime2);

echo 'Aantal dagen:' . $difference->days;


Als ik nu bijvoorbeeld dit ingeef als data 05/03/2017 tot 20/03/2017 dan krijg ik volgende foutmelding:

"Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (20/05/2017) at position 0 (2): Unexpected character' in /home/deindjz190/domains/redcodefox.com/public_html/verlof/profile.php:45 Stack trace: #0 /home/deindjz190/domains/redcodefox.com/public_html/verlof/profile.php(45): DateTime->__construct('20/05/2017') #1 {main} thrown in /home/deindjz190/domains/redcodefox.com/public_html/verlof/profile.php on line 45"

Mijn inziens is dat ie denkt dat 20 de maand is ipv de dag. Hoe krijg ik dit juist ingesteld?

Het juist afhandelen van input doe ik meestal pas achteraf wanneer hetgeen dat verwerkt moet worden correct verloopt. Het is toch nog in development, waardoor ik mij geen zorgen hoef te maken om bad user input.

Acties:
  • 0 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Timezone instellen.

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 13:28

orf

bython schreef op zondag 25 juni 2017 @ 14:26:
@RedHat

Bedankt!

@Bee.nl

Bedankt hier kan ik wat mee!

Nu heb ik de error reporting aanstaan en het volgende veranderd:

PHP:
1
2
3
4
5
6
7
$datetime1 = new DateTime($_POST['event-start-date']);

$datetime2 = new DateTime($_POST['event-end-date']);

$difference = $datetime1->diff($datetime2);

echo 'Aantal dagen:' . $difference->days;


Als ik nu bijvoorbeeld dit ingeef als data 05/03/2017 tot 20/03/2017 dan krijg ik volgende foutmelding:

"Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (20/05/2017) at position 0 (2): Unexpected character' in /home/deindjz190/domains/redcodefox.com/public_html/verlof/profile.php:45 Stack trace: #0 /home/deindjz190/domains/redcodefox.com/public_html/verlof/profile.php(45): DateTime->__construct('20/05/2017') #1 {main} thrown in /home/deindjz190/domains/redcodefox.com/public_html/verlof/profile.php on line 45"

Mijn inziens is dat ie denkt dat 20 de maand is ipv de dag. Hoe krijg ik dit juist ingesteld?

Het juist afhandelen van input doe ik meestal pas achteraf wanneer hetgeen dat verwerkt moet worden correct verloopt. Het is toch nog in development, waardoor ik mij geen zorgen hoef te maken om bad user input.
Dat kun je hier mee regelen:

DateTime::createFromFormat();

Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

Het formaat wordt niet ondersteund als ctor argument. Zie hier voor de lijst: http://php.net/manual/en/datetime.formats.date.php. Dus dat is ofwel het voorstel van @orf hierboven volgen, ofwel het format aanpassen.

De manual biedt een schat aan informatie ;)

Acties:
  • 0 Henk 'm!

  • Henk007
  • Registratie: December 2003
  • Laatst online: 06-04 00:29
Ik ben zelf geen developer, maar ik vind de werkwijze verre van robuust.
Ik zie bijvoorbeeld nergens dat je rekening houdt met wettelijke feestdagen die binnen het tijdvak zouden kunnen vallen.

Acties:
  • +1 Henk 'm!

  • DirkZzZ
  • Registratie: September 2007
  • Laatst online: 04-09 10:02
Ik weet niet of je packages mag gebruiken maar persoonlijk zou ik gewoon Carbon naar binnen trekken, daar heb je gewoon een methode genaamd diffInWeekdays etc.

http://carbon.nesbot.com/docs/

Acties:
  • 0 Henk 'm!

  • bython
  • Registratie: Mei 2012
  • Laatst online: 24-08 09:01
@orf @Bee.nl

Thanks!

Dit is nu de code om de dagen te bereken en deze werkt zoals het hoort!

PHP:
1
2
3
4
5
6
7
$datetime1 = DateTime::createFromFormat('d/m/Y', $_POST['event-start-date']);

$datetime2 = DateTime::createFromFormat('d/m/Y', $_POST['event-end-date']);

$difference = $datetime1->diff($datetime2);

echo 'Aantal dagen: ' . $difference->days;


@Henk007

Dit wordt in de eerste versie nog manueel ingevuld, aangezien wij niet altijd een brugdag maken (dwz als de wettelijke feestdag op donderdag valt dat vrijdag dan ook verlof is..) en er wordt ook op zaterdag gewerkt voor sommige werknemers wat ook weer de complexiteit verhoogd.

@DirkZzZ

Merci, ik ga dat eens bekijken voor in de toekomst te gebruiken.
Pagina: 1