OLE date-time naar ISO time

Door Robert Deiman, 18 jaar geleden, 7.290x bekeken

Mensen worden steeds handiger en tonen steeds meer op internet. Ook steeds meer apparatuur kan met de computer communiceren, maar helaas gebruiken ze niet allemaal dezelfde standaarden.

Zo gebruiken we hier op internet (in databases en dergelijke) de ISO standaard voor een datum. (yyyy-mm-dd hh:ii:ss) Echter is er ook een apparaat op de markt,
het TFA-Nexus weerstation, welke een heel andere standaard notatie gebruikt om de gegevens op te slaan/ naar de computer te zetten. Namelijk de OLE standaard.
Deze standaard geeft een datum weer als 1 lange float value, waarbij de volgende structuur wordt aangehouden:
- Het getal voor de komma is het aantal dagen vanaf 30-12-1899 00:00:00.
- Het getal na de komma geeft aan een hoeveelste deel van de huidige dag is verstreken. 0,5 betekend dus dat het een halve dag (12 uur) later is afgaande op de OLE standaard. (dus 30-12-1899 12:00:00).

Onderstaande snippet/ functie zet een OLE datum om naar een voor ons bruikbare datum.

Gesponsorde koppelingen

PHP script bestanden

  1. ole-datetime-naar-iso-time

 

Er zijn 11 reacties op 'Ole datetime naar iso time'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen


18 jaar geleden
 
0 +1 -0 -1
Je moet even die $testdate in die explode in $ole veranderen ;-)
Voor de rest wel slim bedacht.
Robert Deiman
Robert Deiman
18 jaar geleden
 
0 +1 -0 -1
@Karl
Dankje. Het was eerst geen functie, heb dit geschreven omdat iemand een probleem had met omzetten van die datum. Heb daarom die $testdate per ongeluk laten staan.
Jelmer -
Jelmer -
18 jaar geleden
 
0 +1 -0 -1
Het kan ook met puur ints en floats, zonder de trucjes met explode en strings:
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
<?php
function ole_to_iso($ole)
{

    //Knip datum op in aantal hele dagen en deel van dag
    $days = floor($ole);
    $daypart = $ole - $days;
    //bereken het aantal seconden per dag
    $seconds_day = 60*60*24;
    //bereken het aantal seconden dat erbij moet worden opgeteld
    $seconds_plus = $daypart * $seconds_day;
    //Bepaal de nieuwe datum en geef deze terug
    return date('Y-m-d H:i:s',mktime(0,0,$seconds_plus,12,30 + $days,1899));
}

?>


edit: brie heeft gelijk, round is hier niet handig. Heb ik veranderd in floor.
Robert Deiman
Robert Deiman
18 jaar geleden
 
0 +1 -0 -1
@Jelmer
Is op zich een nog betere oplossing, al is dat van mij misschien beter leesbaar. Ik zal 'm toevoegen als verbetering.
Hipska BE
Hipska BE
18 jaar geleden
 
0 +1 -0 -1
Ik vond ook al dat die explode daar niet hoorde.. Maar was even te lui om een alternatief te zoeken.

Verder had ik nog de bedenking: Is er geen nood naar een inverse functie? dus van ISO naar OLE ?
Boris Mattijssen
Boris Mattijssen
18 jaar geleden
 
0 +1 -0 -1
@Jelmer
Regel 5 moet ff:
$days = (int) $ole;
worden.
Robert Deiman
Robert Deiman
18 jaar geleden
 
0 +1 -0 -1
In dit geval niet, het zou op zich best mogelijk moeten zijn hoor, daar niet van, misschien ga ik die ook nog wel maken als toevoeging op deze snippet.

Het ging hier om een apparaat (TFA-Nexus weerstation) welke de datum zo doorgaf aan de computer. Om hier op internet mee te kunnen werken moet het omgezet kunnen worden. Je gaat die datum niet weer terug omzetten om op het apparaat te gebruiken, dus is er geen nood voor die inverse functie.
Mocht ik morgen wat tijd over hebben op 't werk, dan ga ik die misschien ook wel maken.

@Jelmer
Je moet overigens floor gebruiken, als het getal na de komma groter is dan een 5 (dus je komt bijv op 13914,75 uit) dan moeten er nog steeds 13914 dagen zijn verstreken en niet 1 meer)
ToySoldier ZegIkNiet
ToySoldier ZegIkNiet
18 jaar geleden
 
0 +1 -0 -1
Om het makkelijker in gebruik te maken:

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
<?php
function ole_to_iso($ole, $format = 'Y-m-d H:i:s')
{

    //Knip datum op in aantal hele dagen en deel van dag
    $days = floor($ole);
    $daypart = $ole - $days;
    //bereken het aantal seconden per dag
    $seconds_day = 60*60*24;
    //bereken het aantal seconden dat erbij moet worden opgeteld
    $seconds_plus = $daypart * $seconds_day;
    //Bepaal de nieuwe datum en geef deze terug
    $iTime = mktime(0,0,$seconds_plus,12,30 + $days,1899);
    if ( $format === false )
    {

        return $iTime;
    }

    else
    {
        return date( $format, $iTime );
    }
}

?>
Robert Deiman
Robert Deiman
18 jaar geleden
 
0 +1 -0 -1
@ToySoldier en Jelmer
Ik heb ook beide jullie versies bij de code gepost, omdat ik denk dat het allemaal prima oplossingen zijn, waarmee we maar eens weer aangeven/ laten zien dat er meerdere (goede) oplossingen zijn voor eenzelfde probleem.

Ik heb ook een omgekeerde functie geschreven, die staat hier nu ook bij in het script.
Steen
steen
18 jaar geleden
 
0 +1 -0 -1
Kun je niet beter bepalen welke twee van de vier functies de besten zijn? Een paar snelheidstestjes?
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Robert Deiman
Robert Deiman
18 jaar geleden
 
0 +1 -0 -1
Die van Jelmer is het snelste, maar ik denk dat die van mij beter (mijn mening dus) leesbaar is. Die van ToySoldier is gemakkelijk in gebruik in de zin van dat je een datum opmaak kan meegeven.

En er zijn maar 3 functies hetzelfde, de laatste (of eigenlijk de 2e functie van boven naar beneden) functie die is toegevoegd, is voor het terugrekenen van een datum naar ole tijd, dus die valt af.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. ole-datetime-naar-iso-time

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.