<?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]