Datum aus .ics Datei auslesen und nächsten "Termin" ausgeben

F

freeman1988

Grünschnabel
Hallo.
Zuersteinmal ein kurzes Danke für eure Arbeit und dieses tolle Forum.

Ich habe natürlich die Suchfunktion genutzt und auch auf eigene Faust lange herumgesucht, aber bin leider bei diesem Problem hängen geblieben.

Folgende Problemstellung:
Ausgangsmaterial ist eine .ics Kalenderdatei. Aus der habe ich die Anfangszeiten aller Termine herausgeholt
ed -n -e '/DTSTART:20/p' alarm.ics > alarmzeiten
Danach den ganzen Müll weggecuttet
cut -d ":" -f2 quelle > ziel
cut -b1-11 alarmzeiten2 > alarmzeiten3

Jetzt stehn in dieser Datei alle Daten drinnen, vergangene wie zukünfige.

Da das ganze in weiterer Folge zu einem Wecker werden soll muss ich jetzt das nächstfolgende Datum auf now raussuchen. Das wird dann in eine at-Funktion geschrieben und in nvram-wakeup eingetragen.

Das Problem ist also: Wie macht man eine Suche, bei der man die nächste Zahl, größer als die Zahl die date ausgibt, sucht? (Ich geh mal davon aus dass man dazu die Datumswerte am besten in Sekunden umwandelt)


PS.: Das ist dass erste Mal dass ich mich an sowas herantrau, also seit nachsichtig :)

OS: Gentoo, Shell: BASH


Danke für eure Hilfe.
Ich hoffe ich hab mich halbwegs klar ausgedrückt. :think:
 
Hallo
Wenn du wirklich Hilfe willst, dann ist es notwendig die Ausgangsdaten korrekt zu benennen und das erwartete Ergebnis ebenso.
Woher sollen wir wissen, welche Daten vorliegen?
Weiterhin solltest du deine verwendete Shell benennen.
In welchem Format liegt denn deine Zeitangabe vor?
An GNU date kann man ja eine Zeit verfüttern, die mit %s den Timestamp augibt.
Aber das ist alles sehr spekulativ...

Woher soll ich wissen ob du das zur Verfügung hast?


Also bmühe dich nochmal etwas genauer.
Gruß Wolfgang
 
danke

erstmal danke für deine Antwort.

Ausgangsdatei ist alarm.ics
Darin liegen die Zeiten in einem "Date-kompatiblen" Format (zB 20070212.....)
Diese Daten kann man problemlos mit date in jedes gewünschte Format konvertieren.

Als erwartetes Ergebnis würde reichen wenn ich einfach das gesuchte Datum ausgeben könnte. In einem mit date kompatiblen Format.

Shell ist BASH, wie oben schon geschrieben.


Ich hoffe das ist genau genug. (??)
 
Hallo
Ich weiß zwar immer noch nicht, wie die Daten aussehen, aber wenn es dir nicht um das Parsen geht, sondern nur um das Berechnen:
GNU date:
Abweichungen mit dieser Methode (verwende hier extra nicht den Fromatierer %s für Timestamp) zu anderen Versionen sollten gering sein und aus der Manpager zu erfahren sein.
Code:
$ date -d"now 10 days"
Do 22. Feb 12:50:02 CET 2007
$ date -d"20070212 12:50:10 CET 10 days"
Do 22. Feb 12:50:10 CET 2007

Gruß Wolfgang
 
Hmm.

Also die Daten stehen in dem .ics-File so drinnen

PHP:
BEGIN:VEVENT
CREATED:20070124T162653Z
LAST-MODIFIED:20070124T162653Z
DTSTAMP:20070124T162653Z
UID:uuid:1169655997140
SUMMARY:Neuer Termin
DTSTART;TZID=/mozilla.org/20050126_1/Europe/Vienna:20070124T151500
DTEND;TZID=/mozilla.org/20050126_1/Europe/Vienna:20070124T153000
END:VEVENT

Davon habe ich nur die Zeile DTSTART benutzt.
Der Timestamp darin ist also 20070124T15

Nachdem ich die ganze alarm.ics nach diesen DTSTART-Zeilen durchsucht habe hab ich dann eine Liste von Daten.


Jetzt brauche ich lediglich diese Datenzeilen mit dem jetzigen Datum vergleichen. Als Ausgabe möchte ich das am nächsten zu jetzt folgende datum...

Bsp.:

---datenliste - eingabe---
200702110700
200702120700
200702130700
200702140700
---/datenliste------

Datum jetzt (Ausgabe von date, also lokales Datum) = 200702121720

Ausgabe: 200702130700


:hilfe2:
Ich danke euch für eure Geduld......
 
Ich finde die Benutzung von date reichlich undurchsichtig, deswegen ist meine Lösung nicht unbedingt optimal. Aber vielleicht hilft's:

Code:
bla$ tdate=$(echo 200702121720 | sed 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1-\2-\3 \4:\5/')
bla$ date "+%Y%m%e%H%M" -d "$tdate + 1 day"                                                  
200702131720

Gruß, Daniel
 
Bitte korrigier mich, wenn ich was falsch verstehe, aber du rechnest zum lokalen Datum 1 Tag dazu, oder?

Vl. hast du das falsch gelesen, aber die Lösung soll das nächstfolgende Datum aus der Datenliste ausgeben - in diesem Fall 200702130700
 
Mist, wer lesen kann. Ich hätt mir einigen Kummer mit date ersparen können. ;)

Mal sehen, ob ich Dich jetzt richtig verstanden habe:

Code:
tdate=$(date "+%Y%m%e%H%M")
cat datelist | while read i; do
  if [ "$tdate" -le "$i" ]; then
    echo $i
    break
  fi
done

In datelist steht:

Code:
200702110700
200702120700
200702130700
200702140700
 
Zuletzt bearbeitet:
Zurück
Oben