probleme de conversion EXCEL vers CSV

Eléphant du PHP | 89 Messages

31 déc. 2008, 19:18

bonjour à tous et bonnes fêtes!

J'ai crée une page en php afin de convertir des fichiers EXCEL en CSV et de les insérer dans une base de données MYSQL. Tout irait bien si les dates et les durées se convertissaient correctement, mais là probléme :
les dates sous excel sont au format : 19-mars-07 19:12:05
et elles deviennent en CSV : 39160.8000578704
j'ai un peu compris qu'il s'agissait d'un timestamp et j'ai trouvé une petite fonction sur le net permettant de corriger cela
function ExcelToDate($inVar) { 
  return date("Y-m-d H:i:s",(($inVar - 25569)*86400)-3600); 
} 
En revanche pour les durées je bloque
durées sous EXCEL : 0:00:13
durées en CSV : 0.000150462962962963
et là je n'arrive pas à trouver la formule pour reconvertir ce timestamp en secondes!

Merci pour votre aide !

Eléphant du PHP | 170 Messages

01 janv. 2009, 12:42

Tous mes meilleurs voeux ...

La durée ( 0.000150462962962963 ) semble être exprimée en jours.

Donc en multipliant cette valeur par 86400 on obtiendrait la durée en secondes :)

Eléphant du PHP | 89 Messages

01 janv. 2009, 13:46

Merci beaucoup Blof!

Tu m'a montré le chemin pour aller vers la lumiére
durées sous EXCEL : 0:00:13
durées en CSV : 0.000150462962962963
avec ta formule j'obtenais : 1:00:13
J'enleve donc 3600 secondes!
function ExcelTodure($inVar) { 
  return date("H:i:s",($inVar*86400)-3600); 
} 
Encore merci

Eléphant du PHP | 170 Messages

01 janv. 2009, 23:57

J'enleve donc 3600 secondes!
C'est parce qu'en France nous sommes à GMT +01:00 et la fonction date() utilise l'heure locale.

Ta fonction ExcelTodure() et la fonction ExcelToDate() donnerait des résultats erronés avec un serveur réglé sur un autre fuseau horaire.

La fonction gmstrftime() éviterait ce problème :
gmstrftime() se comporte exactement comme strftime() hormis le fait que
l'heure utilisée est celle de Greenwich (Greenwich Mean Time (GMT)).
ça donnerait :
function ExcelToDate($inVar) { 
  return gmstrftime("%Y-%m-%d %H:%M:%S",($inVar - 25569) * 86400);
}
function ExcelTodure($inVar) {
  return gmstrftime("%H:%M:%S",$inVar*86400);
}
// ( c'est un usage détourné de gmstrftime() pour afficher une durée, mais pourquoi pas ... )