Scripts

OLE date-time naar ISO time

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.

ole-datetime-naar-iso-time
<?php
$testdate = 40062.757639;

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

echo ole_to_iso($testdate);
?>

[b]De omgekeerde functie[/b]
<?php
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;
}
?>
[quote='edit']
[b]Na aanleiding van een opmerking van Jelmer in de reacties.[/b]
Het kan ook zonder explode en de floatval functie, namelijk zo:

<?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));
}
?> 
[/quote]

[quote='edit']
[b]Na aanleiding van een opmerking van ToySoldier in de reacties.[/b]
De functie aangepast, naar een versie waarbij je het datumformaat (php vorm) meegeeft in de functie.
Omdat het dan niet meer specifiek van ole_to_iso is, maar een datumopmaak zoals je zelf kiest, heb ik er ole_to_date van gemaakt.

<?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 );
    }
}
?> 
[/code]

Reacties

0
Nog geen reacties.