PhP date format
Vandaag is het 22 augustus 2012. In excel wordt deze dag opgeslagen als 41143.
Dit omdat het vandaag de 41143 de dag is sinds 1 januari 1900.
Voor mijn PhP programma wil ik kunnen zien de hoeveelste dag het vandaag is, ook sinds 1 januari 1900.
Ik weet dat er veel verschillende formaten zijn voor de functie date(...), maar nergens kan ik de dag sinds 1900 berekenen.
Is hier al een bestaande functie voor, of weet iemand hier een script voor?
Het is natuurlijk ook uit te tellen, maar dat is erg lastig ivm. schrikkeljaren.
Weet iemand of, en hoe dit makkelijker kan?
Alvast bedankt
~Jeroen
http://www.toly.net/dayssince1970.html doet het met Javascript.
Dat kan je vast wel vertalen naar PHP.
Toevoeging op 22/08/2012 15:13:58:
Dus iets als:
Zie http://codepad.org/gwBhHOHa
Dat kan je vast wel vertalen naar PHP.
Toevoeging op 22/08/2012 15:13:58:
Dus iets als:
Code (php)
Zie http://codepad.org/gwBhHOHa
Gewijzigd op 22/08/2012 15:18:56 door Eddy E
alleen hij wilt het weten vanaf 1900 en niet 1970 ...
Ik weet denk ik ook wel hoe dat komt: schrikkeljaren...
Toevoeging op 22/08/2012 15:24:13:
Ik heb nog een betere:
Code (php)
http://codepad.org/cO2LlKdz
Even express hardcoded dat getal erin gezet.
Rare is... zodra je die 4 (van 40.000) erbij zet, krijg je weer 0 terug.
Lijkt wel of er een maximum aan het aantal dagen wat erbij mag komen zit.
Dat kan je oplossen door het in stapjes erbij te doen, maar of dat handig is?
De datum van vandaag, 41143 wordt geconverteerd naar 'Thursday 24 August 2152'.
Dit is 70 jaar te ver, en 2 dagen te ver.
Enig idee hoe we dat kunnen oplossen?
Alvast bedankt
Edit:
Ik zie dat Eddy Erkelens een ander script had gevonden.
Dit nieuwe script geeft als output 'Saturday 17 February 1973', wat ook ergens fout gaat...
Gewijzigd op 22/08/2012 15:31:07 door Jdog Silverblade
Dit omdat date een timestamp vanaf het Unix Epoch verwacht.
Zie ook:
http://php.net/manual/en/function.date.php
http://www.php.net/manual/en/function.time.php
Het tweede script telt vanaf 1 januari 1970, 1143 dagen erbij op.
Output: Saturday 17 February 1973
Toevoeging op 22/08/2012 15:51:00:
untested ...
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$dagen = 41143;
$excel_start = new DateTime("01-01-1900");
$interval = new DateInterval('P' . $dagen . 'D');
$datum = date_add($excel_start, $interval);
echo $datum->format("l d F Y");
?>
$dagen = 41143;
$excel_start = new DateTime("01-01-1900");
$interval = new DateInterval('P' . $dagen . 'D');
$datum = date_add($excel_start, $interval);
echo $datum->format("l d F Y");
?>
Dit en de methode van Flip (enigszins aangepast) geven allebei 24 augustus, dus 2 dagen verschil.
Dan heb ik het idee dat Excel 1900-01-01 niet meerekent, en de dag van vandaag ook niet.
Gewijzigd op 22/08/2012 16:42:41 door Ger van Steenderen
De code van Ger van Steenderen geeft inderdaad 24 augustus 2012.
Als dat alles is kan ik natuurlijk ook aan het begin van het script 41143 veranderen in 41141. Ik weet alleen niet of dit op het einde/begin van elke maand goed gaat.
Dat ga ik even proberen, en ik laat wel iets weten.
Bedankt
Toevoeging op 22/08/2012 17:22:44:
Edit: Dit werkt perfect.
Voor de genen die het werkende script willen hebben:
Code (php)
Ook op het einde van de maand gaat dit prima, na 31 augustus komt 1 september :)
Bedankt voor de hulp allemaal !
~Jeroen
Lol, je had ook gewoon van 17 kunnen 15 maken ;-)
Code (php)
Ik krijg ook 41141
---
Voor de duidelijkheid: als je de dag van vandaag invult, is het 0 dagen geleden; gisteren = 1 dag geleden, ...
Gewijzigd op 22/08/2012 18:11:01 door Kris Peeters
-17-2 = -19 en niet -15 ;)
Geeft ook 41141, met andere woorden Excel heeft een afwijking(niet ongewoon voor een Mickeysoft app)
Gewijzigd op 22/08/2012 18:32:52 door Ger van Steenderen
Je kunt gewoon het aantal dagen berekenen en daar 2 vanaf halen. Het probleem zit hem in het feit dat 31 december 1899 aangemerkt wordt in VBA als het seriële nummer 1, daarnaast is 1900 ook geen schrikkeljaar, wat een totale afwijking van 2 maakt.
2000, 2100, 2200 zijn wel schrikkeljaren, want ze zijn deelbaar door 4, maar gaat toch geen dag af. De SQL-manier lijkt mij het beste. DateTime() ken ik helemaal niet.
DateTime en zijn aanverwanten zijn classes die geintroduceerd zijn in PHP 5.3
Eddy Erkelens op 23/08/2012 08:16:02:
2000, 2100, 2200 zijn wel schrikkeljaren, want ze zijn deelbaar door 4, maar gaat toch geen dag af. De SQL-manier lijkt mij het beste. DateTime() ken ik helemaal niet.
Klopt, maar tijdens het ontwikkelen van Excel (eigenlijk Lotus) is deze fout wel gemaakt bij het jaar 1900. Vandaar dus ook deze afwijking. Je kunt ergens in Excel ook instellen dat je 1904 Datum systeem wilt gebruiken, wat dus wel een correcte serieel weergave geeft.
2000 was een schrikkeljaar, wegens deelbaar door 400.
1800, 1900, 2100, 2200, ... zijn geen scrikkeljaren, wegens ( deelbaar door 100 && niet deelbaar door 400)
Ja, zie ik nu ook.