Danke für die Datei. Da sind sehr viele merkwürdige Format-Abweichungen und -Mischungen drin. Einige kann ich abfangen, andere aufgrund von (teils bereits vorhandenen) Folgeproblemen nicht.
-
SUMMARY;LANGUAGE=de
Das tritt gelegentlich auf und ist kein Problem. -
DTEND;TZID… und DTSTART;TZID="(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien"
Das betrifft offenbar nur die 7 wahrscheinlich zuletzt eingetragenen Termine. Kannst Du die verwendete Zeitzone bei der Termineingabe beeinflussen? Da das ICS-Trennzeichen zwischen Parameter (z.B. Startzeit) und konkretem Inhalt „:“ ist, bringt die Angabe „UTC+01:00“ das Skript aus dem Tritt. Ich kann das zwar vorab ersetzen, aber aufgrund ihrer Länge verursacht diese Zeitzone bereits in der ICS-Datei einen Zeilenumbruch in der nachfolgenden Datumsangabe. Das bekomme ich nicht in den Griff, weil die Zeilenumbrüche als Trennung zwischen den Termindetails verwendet werden. Da sieht das Skript keinen Unterschied und schneidet das umgebrochene Datum einfach ab, wodurch es ganz verloren geht.
Beipiel:
DTEND;TZID="(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien":2014
0705T113000
DTSTAMP:20140427T120401Z
DTSTART;TZID="(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien":20
140705T100000
- Jedes Terminende wird vor dem Terminstart genannt (das ist der Grund für Deine Fehlermeldungen). Wer macht denn sowas!? Microsoft? :mad:
Folgeprobleme entstehen dadurch in dem Teil des Skripts, wo die mehrtägigen Termine behandelt werden. Die Umkehrung von End- und Starttermin plus die vielen Formatabweichungen/-Mischungen ergeben eine Kombinationsvielfalt, die ich praktisch nicht mehr abfangen kann. Deshalb müsstest Du mit „unbehandelten“ Dauerterminen leben, von denen Dir dadurch nur der Starttermin angezeigt wird. Allerdings habe ich bei Dir auch keine Dauertermine gefunden.
Mit den genannten Einschränkungen sollte das hier funktionieren:
<?
/*=============================================
Beschreibung:
In diesem Skript werden die relevanten Termindaten einer *.ics (Sunbird
Terminverwaltung) in eine *.txt konvertiert.
================================================*/
//Bitte anpassen
//------------------------------------------
//Ablageort für *.txt
$file_txt = IPS_GetKernelDir()."media\\Kalender\\datei_kurz.txt";
//Ablageort für *.ics ("Sunbird")
$file_sunbird = IPS_GetKernelDir()."media\\Kalender\\Datei.txt";
//Terminart
$term_art = "NAME";
//------------------------------------------
//--------------------------- Main ----------------------------
// Variablen
//String für kompletten Sunbird Datensatz
$Sunbird_DS_komplett = "";
//String array für Termine
$term_arr_komplett = array();
$dauer_term_arr = array();
//$term_arr_komplett[] = "000000000,00,00,,";
//timestamp,tag,monat,inhalt,art
//Daten holen
if(file_exists($file_sunbird))
//Termine in Variable einlesen
$Sunbird_DS_komplett = file_get_contents($file_sunbird);
// war die Kalenderdatei gefüllt?
if(strpos($Sunbird_DS_komplett,'VCALENDAR')){
//Zeitzone korrigieren
$Sunbird_DS_komplett = str_replace("DTSTART;TZID=\"(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien\"", "DTSTART;VALUE=DATE", $Sunbird_DS_komplett, $count);
//Den kompletten Datensatz zerlegen
$Sunbird_DS_arr_komplett = explode("BEGIN:", $Sunbird_DS_komplett);
//alle Datensätze durchlaufen
foreach($Sunbird_DS_arr_komplett as $key_1 => $value_1)
{
$term_inhalt = "";
$term_end = "ENDE";
$term_tag = "";
$term_monat = "";
$term_jahr = "";
$startdate = "";
//Schalter inaktiv setzen
$rrule = 0;
$zusatz = 0;
//Der erste Datensatz ist "2"
if($key_1 > 1)
{
//einzelnen Datensatz in Daten zerlegen
$Sunbird_arr = explode("
", $value_1);
// $Sunbird_arr = explode("
", $value_1);
//Nur Datensätze vom Typ "VEVENT" durchlaufen
if($Sunbird_arr[0] == "VEVENT")
{
//alle Daten durchlaufen
foreach($Sunbird_arr as $key_2 => $value_2)
{
//Daten zerlegen in Parameter und Wert
$Data_arr = explode(":", $value_2);
//Kontrolle der Parameter
Switch($Data_arr[0])
{
case "SUMMARY;LANGUAGE=de":
case "SUMMARY":
$term_inhalt = $Data_arr[1];
$term_inhalt = iconv('UTF-8','ISO-8859-1',$term_inhalt);
break;
//Wiederholender Termin
case "RRULE":
//Wiederholung zerlegen und in array
// $term_rule_arr = explode(";", $Data_arr[1]);
$rrule = 1;
$timestamp = time();
$diesjahr = date("Y",$timestamp);
$term_jahr_rr = $diesjahr;
break;
//Zeitstempel Datum
case "DTSTART;VALUE=DATE":
$term_jahr = substr($Data_arr[1], 0, 4);
$term_monat = substr($Data_arr[1], 4, 2);
$term_tag = substr($Data_arr[1], 6, 2);
if ($rrule)
{
$term_jahr = $term_jahr_rr;
}
$startdate = $Data_arr[1];
$start_timestamp = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
break;
//Zeitstempel Datum und Zeit
case "DTSTART":
case "DTSTART;TZID=Europe/Berlin":
$term_jahr = substr($Data_arr[1], 0, 4);
$term_monat = substr($Data_arr[1], 4, 2);
$term_tag = substr($Data_arr[1], 6, 2);
if ($rrule) {
$term_jahr = $term_jahr_rr;
}
break;
case "DTSTART;VALUE=DATE;TZID=Europe/Berlin":
$term_jahr = substr($Data_arr[1], 0, 4);
$term_monat = substr($Data_arr[1], 4, 2);
$term_tag = substr($Data_arr[1], 6, 2);
if ($rrule) {
$term_jahr = $term_jahr_rr;
}
break;
break;
}
}
//Restliche Daten generieren
//Time stamp
$term_timestamp = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
//Termin array zusammenstellen
$term_arr[0] = $term_timestamp;
$term_arr[1] = sprintf("%02s", $term_tag);
$term_arr[2] = sprintf("%02s", $term_monat);
$term_arr[3] = $term_inhalt;
$term_arr[4] = $term_art;
$term_arr[5] = $term_end;
//Termin in einen String
$termin = implode(",", $term_arr);
$term_arr_komplett[] = $termin;
}
}
}
//$term_arr_komplett = array_merge($term_arr_komplett,$dauer_term_arr);
sort($term_arr_komplett); // nach Zeit sortieren
$term_neu_komplett = implode("
", $term_arr_komplett); // in String zurück
$handle=fopen($file_txt, "w");
fwrite($handle,$term_neu_komplett);
fclose($handle);
}
//---------------------- Main Ende ----------------------------
?>
Ich hoffe, ich hab keinen Copy&Paste-Fehler gemacht.
Für die Amsterdam-Termine musst Du Dir was an der Quelle einfallen lassen, sie fallen sonst überwiegend raus!
Grüße
galleto