PhP date format

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jdog Silverblade

Jdog Silverblade

22/08/2012 15:08:43
Quote Anchor link
Hallo,
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
 
PHP hulp

PHP hulp

25/12/2024 04:03:23
 
Flip --

Flip --

22/08/2012 15:12:39
 
Eddy E

Eddy E

22/08/2012 15:12:45
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$dag
= 41143;
$timestamp = ($dag * 24 * 60 * 60);
$date = strtotime ( '+70 year' , $timestamp);
echo date("l d F Y", $date);
?>


Zie http://codepad.org/gwBhHOHa
Gewijzigd op 22/08/2012 15:18:56 door Eddy E
 
Flip --

Flip --

22/08/2012 15:17:30
Quote Anchor link
alleen hij wilt het weten vanaf 1900 en niet 1970 ...
 
Eddy E

Eddy E

22/08/2012 15:19:23
Quote Anchor link
Is reeds geëdit, ik zag het later ook. Blijkt het toch ergens niet goed te gaan.
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$dagen
= 41143;
$date = strtotime('+1143 day', 0);
echo date("l d F Y", $date);
?>


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?
 
Jdog Silverblade

Jdog Silverblade

22/08/2012 15:29:01
Quote Anchor link
@Eddy Erkelens: Mooi script, alleen een klein foutje betreffende '+70 year'.
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
 
Flip --

Flip --

22/08/2012 15:41:06
Quote Anchor link
Het eerste script van Eddy geeft dus als output: Thursday 24 August 2152
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)
PHP script in nieuw venster Selecteer het PHP script
1
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");
?>
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/08/2012 16:42:07
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$date
= (41143 - (70 * 365) - 17) * 86400;
echo date('d-m-Y', $date);
?>

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
 
Jdog Silverblade

Jdog Silverblade

22/08/2012 17:19:24
Quote Anchor link
Ok, bedankt allemaal.
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

$datum
= 41143;

$datum = $datum - 2;
$date = ($datum - (70 * 365) - 17) * 86400;
echo date('d-m-Y', $date);
?>

Ook op het einde van de maand gaat dit prima, na 31 augustus komt 1 september :)


Bedankt voor de hulp allemaal !
~Jeroen
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/08/2012 17:51:42
Quote Anchor link
Lol, je had ook gewoon van 17 kunnen 15 maken ;-)
 
Kris Peeters

Kris Peeters

22/08/2012 18:06:30
Quote Anchor link
Dit zal absoluut niet het meest efficiënte script zijn, maar het zal wel 100% kloppen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$start
= date_create('1900-01-01');
$stop = date_create('now');  // of vul gelijk welke datum in, later dan $start

for($counter = 0 ;$start->format('Y-m-d') !== $stop->format('Y-m-d'); $counter++) {
  $start->modify('+1 DAY');
}

echo 'aantal dagen geleden: ' . $counter;
?>


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
 
Jdog Silverblade

Jdog Silverblade

22/08/2012 18:14:54
Quote Anchor link
Inderdaad @Ger van Steenderen, maar maak er dan wel meteen 19 van en geen 15.
-17-2 = -19 en niet -15 ;)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/08/2012 18:32:21
Quote Anchor link
Pardon, je hebt helemaal gelijk.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT DATEDIFF('2012-08-22', '1900-01-01')

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
 
Marco M

Marco M

23/08/2012 02:35:07
Quote Anchor link
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.
 
Eddy E

Eddy E

23/08/2012 08:16:02
Quote Anchor link
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/08/2012 08:30:27
Quote Anchor link
Elk jaar dat je kan delen door 4 is een schrikkeljaar, behalve de jaren die deelbaar zijn door 100 en niet door 400, en waarbij natuurlijk de uitkomst van de delingen een geheel getal moet zijn.
DateTime en zijn aanverwanten zijn classes die geintroduceerd zijn in PHP 5.3
 
Marco M

Marco M

23/08/2012 15:47:46
Quote Anchor link
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.
 
Kris Peeters

Kris Peeters

23/08/2012 16:11:24
Quote Anchor link
De uitleg van Ger klopt. Die van Eddy is wat onvolledig.

2000 was een schrikkeljaar, wegens deelbaar door 400.
1800, 1900, 2100, 2200, ... zijn geen scrikkeljaren, wegens ( deelbaar door 100 && niet deelbaar door 400)
 
Eddy E

Eddy E

23/08/2012 16:24:41
Quote Anchor link
Ja, zie ik nu ook.
 



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.