date_to_ole functie
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)
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
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;
?>
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
Maar misschien is er een handigere manier om dit te doen? Of een betere?
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.