Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mo 05.10.15 14:29 
Hallo,

ich suche eine „intelligente“ Methode (das ist meist auch eine einfache), zum Addieren/Subtrahieren von Datum/Uhrzeit.
Hintergrund: Ich war mit einer Reisegruppe unterwegs. Nun soll eine gemeinsame Diashow entstehen. Das Problem ist, dass einige Fotografen das Datum/Uhrzeit ihrer Kamera nicht korrekt eingestellt hatten. Zur „Synchronisierung“ der Bilder, ist das Aufnahmedatum anzupassen. Als bekannt darf angenommen werden die Differenz der Zeitabweichung zum korrekten Datum in der Form: Anzahl der Jahre, Monate, Tage, Stunden, Minuten, Sekunden. Die Abweichung kann pro Parameter positiv oder negativ sein, also z.B. +5 Jahre, -3 Monate, +2 Tage, -4 Stunden, +3 Min, 0 Sec.

Schon realisiert habe ich ein kleines Programm, das mir die Dateien eines Ordners mit Speicherdatum anzeigt und wenn die Zeile markiert wird, die Datei(en) ein neues Datum erhält (übernommen von einem Date- TimePicker). Das meiste ist also schon gelöst. Wo liegt nun mein Problem?

Der Typ TDateTime in Delphi ist vom Typ Double und zerfällt in einen ganzzahligen Anteil von Tagen und einen Kommawert von Sekunden. Wie komme ich aus obigen (relativen) +/-Einzelwerten zu einem Zeit-Korrekturwert, der aufs Dateidatum addiert zu einem gültigen neuen Datum führt. Beachte: Anzahl der Tage im Jahr bzw. Monat sind keine Konstanten. Außerdem könnte durch eine negative Sekundenzahl auch der Tageswert sich wieder ändern. Gibt es eine einfache Methode?
Danke im Voraus
baumina
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: Mo 05.10.15 14:33 
Aufnahmedatum := Aufnahmedatum + Korrekturdatum
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 05.10.15 14:39 
Schau Dir mal in der Hilfe an, welche Funktionen Dir die Unit DateUtils so bietet. Da findet sich z.B. IncDay, IncMonth, IncYear, usw usf.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Mo 05.10.15 18:01 
Problematisch ist insbesondere die Aufteilung der Tage(gesamt) auf Jahre, Monate und Tage(im Monat).
Da nicht jeder Monat und jedes Jahr gleich lang ist, wird immer ein Referenzdatum benötigt, auf das sich diese Aufteilung bezieht.
Das könnte z.B. das aktuelle Datum sein.

- Referenzwert1 mit Now() ermitteln
- Mit "DecodeDateTime()" den Referenzwert1 zerlegen.
- Die Differenzen der Datums und Zeitanteile addieren.
- Mit "EncodeDateTime()" den Referenzwert2 erzeugen
- Differenz = Referenzwert2 - Referenzwert1
- Differenz auf den Zeitstempel der Fotos addieren

Alternativ zur Eingabe der Differenz könnte der Anwender einfach für ein Foto den richtigen Zeitstempel erfassen, oder die richtige aktuelle Zeit.
Damit kann man die Differenz ermitteln und einfach auf alle Fotos anwenden und/oder auch die Uhr der Kamera stellen.
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Mo 05.10.15 19:18 
Hallo,

StrtoDateTime ist gut. Das konvertiert in TDatetime (double), was die Tage ab 30.12.1899 angibt. Damit kann man gut rechnen (+ 1/24 bedeutet 1 Stunde weiter). Zurück dann mit DateTimetoStr.

Die Formatierung kann über "Formatsettings" eingestellt werden, aber bei klappte es meistens mit den gesetzten Standard-Werten.

Gruß
GuaAck
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.10.15 20:07 
Für die Addition von Datums- und Zeitwerten hält die Unit DateUtils diverse Methoden bereit:

  • IncYear: Gibt ein Datum zurück, das um eine bestimmte Anzahl von Jahren verschoben wurde.
    IncMonth: Liefert ein Datum zurück, das um die angegebene Anzahl von Monaten vor oder nach dem Ausgangsdatum liegt.
  • IncWeek: Gibt ein Datum zurück, das um eine bestimmte Anzahl von Wochen verschoben wurde.
  • IncDay: Gibt ein Datum zurück, das um eine bestimmte Anzahl von Tagen verschoben wurde.
  • IncHour: Gibt einen Datums-/Zeitwert zurück, der um eine bestimmte Anzahl von Stunden verschoben wurde.
  • IncMinute: Gibt einen Datums-/Zeitwert zurück, der um eine bestimmte Anzahl von Minuten verschoben wurde.
  • IncSecond: Gibt einen Datums-/Zeitwert zurück, der um eine bestimmte Anzahl von Sekunden verschoben wurde.
  • IncMilliSecond: Gibt einen Datums-/Zeitwert zurück, der um eine bestimmte Anzahl von Millisekunden verschoben wurde.
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mo 05.10.15 23:52 
Hallo, ihr Helfer
Vielen Dank erst mal. Die Hinweise/Ansätze sind gut. Aber ich lasse das Thema noch offen. Produziere im Test bei negativen Eingaben noch zu viele Error-Meldungen. Das kann aber auch daran liegen, dass ich die Zwischenergebnisse in zwei DateTimePickerfeldern ansehen will und dann von dort übernehme. Während eine Uhrzeit 00:00:00 sein kann, ist beim Datum ein 00.00.0000 ungültig. Derzeit raucht der Kopf. Melde mich wenn ich eine funktionsfähige Lösung habe oder nicht mehr weiterkomme.
hRb
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 06.10.15 01:28 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Während eine Uhrzeit 00:00:00 sein kann, ist beim Datum ein 00.00.0000 ungültig.

Das ist doch logisch, denn ein solches Datum gibt es nicht: Die Zählung von Tagen und Monaten beginnt stets bei 1 – einen Nullten Nullten im Jahre Null gibt es nicht und hat es meines Wissens auch nie gegeben.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 06.10.15 07:00 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Hallo, ihr Helfer
Produziere im Test bei negativen Eingaben noch zu viele Error-Meldungen. Das kann aber auch daran liegen, dass ich die Zwischenergebnisse in zwei DateTimePickerfeldern ansehen will und dann von dort übernehme. Während eine Uhrzeit 00:00:00 sein kann, ist beim Datum ein 00.00.0000 ungültig. Derzeit raucht der Kopf. Melde mich wenn ich eine funktionsfähige Lösung habe oder nicht mehr weiterkomme.


Zeig doch mal ein paar Quellcodeausschnitte, dann kann man vielleicht konkrete Tipps geben.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Fr 09.10.15 18:09 
Hallo,
ich melde mich nach einigen Tagen Auszeit zurück. Mein "Glück" ist inzwischen auch fast perfekt. Aber nur fast. Wie gewünscht füge ich einige Codezeilen bei, sage aber zunächst was geht und was noch nicht geht.
Die Hinweise mit IncDay, IncMonth, usw. zu arbeiten waren super. Das Programm läuft inzwischen soweit, dass jeweils die Rechnung mit .Date (=Tag, Monat, Jahr), als auch mit .Time (=Std,Min,Sec) funktioniert. Dabei meine ich, dass wenn z.B. auf den 25.4.xxxx zehn Tage addiert werden, dass dann auch der 5.5.xxxx errechnet wird. Ähnlich ok funktioniert es im Time-Block. Was derzeit nicht funktioniert, ist der rechnerische „Übertrag“ von Stunden zum Tag, also zwischen .Date und .Time.
Beispiel: aus 09.10.2015 22:15:00 plus 10 Stunden wird nicht durch Tagesüberlauf der 10.10.2015 08:15:00, sondern der Tag bleibt unverändert der 09.10. (gleicher Fehler, bei "negativen" Stunden). Ich vermute, dass dies am verwendeten Objekt DateTimePicker liegt, mit dem ich rechne (und anzeige). Ich dachte .Date und .Time sind nur Vor- und Nachkommastellen einer gemeinsamen Variablen. Scheint aber nicht der Fall zu sein.
Programmstruktur: Mein Programm hat eine DriveCombobox, DirectoryListbox und eine StringGrid-Komponente (mit Spalten zum Markieren, lfdNr, Filename, String mit Datum,Uhrzeit). Weiterhin sechs Edit-Felder zur Eingabe von Tag, Mon, Jahr, Std, Min, Sec. Zuletzt einige DateTimePicker.
Programm-Funktion:
1. Alle markierten Dateien im StringGrid-Feld erhalten einheitliches File-Datum aus Date- und Time-Picker.
2. Filedatum einer markierten Dateie lesen und Differenzdatum addieren. Hier ein Codeauszug

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure DiffTime; 
//Addiere auf Filedatum ein + - Differenzdatum
begin with StringGrid1 do begin
DatePicker2.Date:=StrToDate(copy(Cells[3,ARow],1,10)); //Picker1 oder FileDate
DatePicker2.Time:=StrToTime(copy(Cells[3,ARow],13,8)); //Uhrzeit;
//Tag, Monat, Jahr hinzufügen
   DatePicker2.Date:=IncDay(DatePicker2.Date, SpinEditTag.value);
   DatePicker2.Date:=IncMonth(DatePicker2.Date, SpinEditMon.value );
   DatePicker2.Date:=IncYear(DatePicker2.Date, SpinEditJahr.value);
// Sec, Minute, Stunde hinzufügen
   DatePicker2.Time:=IncHour(DatePicker2.Time, SpinEditStd.value);
   DatePicker2.Time:=IncMinute(DatePicker2.Time, SpinEditMin.value);
   DatePicker2.Time:=IncSecond(DatePicker2.Time, SpinEditSec.value);
   TimePicker2.Time:=DatePicker2.Time;  //nur zum Ansehen
endend;


Die Zeile DateTimeStr:=DateToStr(DatePicker2.Date)+ ' ' + TimeToStr(TimePicker2.Time); liefert ggf falschen Tag. Offensichtlich darf ich nicht mit DatePicker rechnen. Wie Sonst?
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Fr 09.10.15 22:26 
Hallo, Pascal-Freunde,
Melde mein Programm funktionsfähig fertig. Es war genau, wie zunächst vermutet: Im DateTimePicker ist der Parameter .Date völlig unabhängig von .Time, macht also keine Überträge zwischen Datum und Uhrzeit. Ich habe daher zum Rechnen eine TDateTime-Variable benutzt und zerlege die zur Anzeige im Picker.
Ist ein richtig schönes Programm geworden. Könnte der eine oder andere sicherlich auch gebrauchen. Gibt es keine "Ecke" im Forum wo man solche Tools anderen frei zur Verfügung stellen kann?
Jedenfalls nochmals danke für die guten Tipps.
hRb
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Sa 10.10.15 08:39 
Schön, dass es jetzt funktionniert! :zustimm:

Wenn Du möchtest, kannst Du es in Freeware Projekte oder in Open Source Projekte stellen, je nachdem.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)