date_to_ole functie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robert Deiman

Robert Deiman

10/09/2009 12:24:00
Quote Anchor link
Naar aanleiding van de snippet "Ole naar iso" probeer ik dit ook andersom te doen. Hiervoor moet ik onder andere het verschil tussen de OLE startdatum en de opgevraagde datum bepalen.

Het probleem is echter dat ik geen timestamp van die datum kan maken, omdat de OLE startdatum voor de UNIX epoch time ligt, welke voor de tijdstempel wordt gebruikt.

Is hier een andere manier voor om het aantal dagen t.o.v. 1899-12-30 00:00:00 te verkrijgen?

edit:
Heb het nu opgelost door eerst het aantal dagen van de ole start datum naar de unix epoch te bepalen en dat getal ook weer te gebruiken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
error_reporting(E_ALL);
//Datum invoer
$testdate = 25569.757639;

function
ole_to_date($ole_stamp,$date_format = 'Y-m-d H:i:s'){
    //Wanneer de datum als string met een , als scheidingsteken is ingegeven, dit aanpassen
    //$ole_stamp = str_replace(',','.',$ole_stamp);
    //Het aantal seconden per dag bepalen

    $seconds_day = 60*60*24;
    //Het aantal dagen vanaf 30-12-1899 00:00:00
    $days = floor($ole_stamp);
    //Het aantal seconden die op de betreffende dag zijn verstreken
    $seconds = ($ole_stamp - $days) * $seconds_day;
    //Creëer de tijdsstempel voor de dag
    $time = mktime(0,0,0+$seconds,12,30+$days,1899);
    //Wanneer $date_format mee is gegeven als zijnde een boolean met als waarde false, geef dan de tijdsstempel terug
    if($date_format === false){
        return $time;
    }

    //Wanneer er een datum formaat is opgegeven, geef dan de datum terug in de opgegeven opmaak.
    else{
        return date($date_format,$time);
    }
}


function
date_to_ole($input_date,$only_days = false){
    //Het aantal dagen van ole naar de unix epoch datum
    $days_from_ole_to_unix = 25569;
    //Maak een timestamp van de unix epoch
    $unix_timestamp = mktime(0,0,0,1,1,1970);
    //Het totaal aantal seconden per dag
    $seconds_day = 60*60*24;
    //complete timestamp van de datum
    $timestamp = strtotime($input_date);
    //bepaal alleen het datum gedeelte van de meegegeven datum. Deze is nodig om het deel voor de . te berekenen
    $date = date('Y-m-d',$timestamp);
    //daar ook een timestamp van maken voor het rekenen
    $date_timestamp = strtotime($date);
    //bereken het aantal dagen tussen de opgevraagde datum en de unix epoch
    $days_from_unix_to_date = ($date_timestamp - $unix_timestamp)/$seconds_day;
    //bepaal het verschil in seconden (vanaf 00:00:00 de opgevraagde datum, tot de opgevraagde tijd op de opgevraagde datum)
    $seconds = $timestamp - $date_timestamp;
    //bepaal het gedeelte voor achter de komma
    $floatvalue = round($seconds/$seconds_day,6);
    //plak de delen bij elkaar
    return $days_from_unix_to_date + $days_from_ole_to_unix + $floatvalue;
}


$datum_uit_ole = ole_to_date($testdate);
echo $testdate.'<br />'.$datum_uit_ole.'<br />';
$datum_naar_ole = date_to_ole($datum_uit_ole);
echo $datum_naar_ole;

?>
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
 
PHP hulp

PHP hulp

29/03/2024 12:11:02
 
Robert Deiman

Robert Deiman

11/09/2009 12:39:00
Quote Anchor link
Is er nog iemand die een andere manier heeft om te rekenen met de OLE standaard. Ik heb nu eerst het aantal dagen tussen OLE en de UNIX epoch bepaald en deze gebruik ik in de functie.
Maar misschien is er een handigere manier om dit te doen? Of een betere?
 
Robert Deiman

Robert Deiman

15/09/2009 09:54:00
Quote Anchor link
Volgens mij is er niemand met een andere/ betere oplossing om de boel om te zetten terug naar een OLE timestamp.
Het is een weinig gebruikte standaard, maar het is wel een standaard. Vind het toch eigenlijk wel een beetje vreemd dat er niets voor is, zeker omdat die blijkbaar toch nog wel wordt gebruikt in sommige apparaten.
 



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.