Zwei Fragen zu Datumskonvertierung

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Vegeta
*
Beiträge: 16
Registriert: Mo, 24.10.2005 14:56

Zwei Fragen zu Datumskonvertierung

Beitrag von Vegeta »

Hallo,

bin bin dabei meine MS Word Makros nun in OpenOffice 2.0 Write zu konvertieren, stoße dabei aber auf ein paar Probleme.

Ich habe ein kleines Makro mit dem ich verschiedene Daten berechne. Word besitzt dafür verschiedene Funktionen, die ich jetzt so nicht in OO finde.

Im Klartext wäre das folgendes:
Wie kann ich die Kalenderwoche bestimmen, in der der aktuelle Tag liegt?

Wenn ich den Unterschied an Tagen von zwei Daten ermittle, habe ich z.B. 700 raus, wie kann ich das jetzt richtig in Jahre, Monate, Wochen und Tage umrechnen?
Word hat eine Funktion mit der man die Anzahl Tage eines Monats bestimmen kann, auf Grund dieser Information kann man auch den Rest bestimmen.

Sehr vielversprechend sah in der Anleitung NumberFormats aus, mit dem man eigentlich das erreichen kann, nur scheint das auf Calc beschränkt zu sein.
Gibt's dafür eine Lösung?

Gruß,
Vegeta
Vegeta
*
Beiträge: 16
Registriert: Mo, 24.10.2005 14:56

Beitrag von Vegeta »

Und noch eine Frage:

Code: Alles auswählen

dim MyDate1 as date
MyDate1="25.05.2005"
print MyDate1 + 1
liefert als Ergebnis den 26.05.2005.
Wenn ich aber rechne:

Code: Alles auswählen

dim MyDate1 as date
MyDate1="25.05.2005"
print MyDate1 - 1
bekomme ich 38496 als Ergebnis. Was muß ich machen, damit das Ergbnis der 24.05.2005 wäre?!
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Vegeta,

ich versuche mal, deine Fragen zu klären. Wichtig erscheint mir, dass du verstehst, wie OOo intern Datumsformate abspeichert.
Alle Datums- und Zeitwerte werden intern als Double-Wert gespeichert, wobei die Zahl vor dem Dezimaltrenner die Anzahl der Tage seit dem 30.12.1899 darstellt, die Zahl nach dem Dezimaltrenner die Zeitinformation enthält (0,5 entspricht somit 12 Stunden).
Aus diesen Werten lassen sich nun alle Möglichkeiten berechnen.

Eine direkte Möglichkeit (Funktion), die Kalenderwoche zu berechnen, gibt es meines Wissens nicht. Hier musst du selbst programmieren. Dies gilt auch für die andern Werte, wobei dies ja nicht so kompliziert ist:
1 Jahr hat 365 Tage (Schaltjahre 366), ein Monat hat 30, 31 oder 28/29 Tage,
ein Jahr hat 52 Wochen ... und so weiter.
Wenn Du also 700 als Differnez heraus bekommen hast, so nimmst du zunächst die Jahre : Jahre = 700 \ 365 Ergebnis 1
Dann die Resttage: Resttage = 700 Mod 365 Ergebnis 335
ja und so geht es dann weiter. Muss du halt noch die Ausnahmen berücksichtigen.

Nun musst du noch wissen, dass OOo versucht, bei Anzeigen (msgbox oder print) sowie bei mathematischen Operationen selbständig zu erkennen, was gewünscht wird und somit date-Variable als (lokalisierten) Datumsstring ausgibt.

Daher funktioniert auch dein Code MyDate1="25.05.2005" , der eigentlich heissen müsste: MyDate = CDate("25.05.2005") - die Funktion CDate wandelt einen Ausdruck in ein Date-Format um. Das wäre die korrekte Schreibweise, OOo Basic macht aber in deinem Fall das gleiche.
Wenn du jetzt zu dem Date eine 1 hinzuzählst, wandelt OOo die 1 ebenfalls in ein Datumsformat um und das Ergebnis ist ein Datum. Ziehst du es aber ab, interpretiert OOo die 1 jetzt als Integer und wandelt das Dateformat ebenfalls in ein Integer-Format um, und genau das zeigt dir "print" oder "msgbox" jetzt an.
Hier hilft einfach nur exakter Programmierstil:

Code: Alles auswählen

print  cdate(mydate1-1)   ' liefert immer 24.05.2005
Durch cdate() wird der Ausdruck immer in ein Datum verwandelt - und dann passt es. Oder du definierst vorher eine zusätzliche Variable :

Code: Alles auswählen

dim dZeitdif as date
dZeitdif = 1  ' ein Tag
print cdate( MyDate1 - dZeitdif)
Eine letzte Möglichkeit zur Überlistung des Automatismusses gibt es auch noch:

Code: Alles auswählen

print MyDate1 + (-1)
führt ebenfalls zum Ergebnis 24.05.2005. Hier behält der interne Interpreter das Format aus MyDate1 bei (durch das Pluszeichen) , da aber das negative Vorzeichen eine höhere Priorität besitzt, wird ein Tag abgezogen :wink:

So viel für heute,

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Antworten