Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Dubidu am 10.06.10 - 17:15:54

Titel: NotesDateTime.adjustMonth
Beitrag von: Dubidu am 10.06.10 - 17:15:54
Hallo,
ich habe hier das komische Verhalten, dass Notes 31.05.2007 00:00 Uhr als Ergebnis liefert und nicht 01.06.2007 00:00 Uhr.

Code
Dim ndt As New NotesDateTime("01.05.2007 00:00")
	
Call ndt.AdjustMonth(1)
	
Msgbox ndt.LSLocalTime

Selbst wenn ich das folgend abändere, erhalte ich immernoch den letzten Tag des Mais als Ergebnis:

Code
Dim ndt As New NotesDateTime("01.05.2007 00:59")

Kann sich das jemand erklären?! Ist das normal? Wie kann ich dieses Verhalten umgehen?!

Liebe Grüße
Giordano
Titel: Re: NotesDateTime.adjustMonth
Beitrag von: koehlerbv am 10.06.10 - 17:48:16
Könnte Dir dieser aktuelle Thread aus dem DominForum (http://www.dominoforum.de/modules/newbb/viewtopic.php?topic_id=21775&forum=55) helfen?

Die NotesDateTime-Klasse ist eh meist überbewertet bzw. unnötig. Du kannst auch simpel mit der Datumsseriennummer rechnen:
Code
	Dim vStart As Variant
	
	vStart = Datenumber (2010, 12, 1)
	
	Messagebox Datenumber (Year (vStart), Month (vStart) + 1, 1)

Du siehst, das funktioniert sogar im Dezember  ;)

Bernhard
Titel: Re: NotesDateTime.adjustMonth
Beitrag von: BigWim am 11.06.10 - 08:52:59
Hallo Bernhard

Zitat
Du siehst, das funktioniert sogar im Dezember 
Nimmst Du das nur hin, frei nach dem Motto: "Probieren geht über Studieren", oder weißt Du, warum das funktioniert?

Eigentlich dürfte das doch gar nicht funktionieren ???

Egal (für mich) ob ich jetzt von links nach rechts oder von rechts nach links die Ausdrücke auflöse, dürften die Ausdrücke Year ... und Month nichts von einander wissen; und der Wert vStart wird ja gar nicht erhöht, sondern nur temporär bei der Auswertung des Ausdrucks Month, und warum weiß Year davon ...

Selbst wenn ich die "Klammer"regel anwende, fände ich es unlogisch. Da es funktioniert (habe es ausprobiert, weil ich es nicht glauben konnte), kann es ja nur bedeuten, dass innerhalb der Klammer von Datenumber von rechts nach links aufgelöst, aber der temporäre Wert vStart die ganze Zeit beigehalten wird.

Komme darauf, weil
Code
	Dim vStart As Variant
	vStart = Datenumber (2010, 12, 1)
	Messagebox Datenumber (Year (vStart)+2, Month (vStart) + 1, 1)
das Datum 1.1.2013 auswirft O0

Also, wenn Du mir einen Tipp geben könntest, welche Regel hier greift, dann könnte ich meine Neugierde befriedigen ....

Danke
Markus

Titel: Re: NotesDateTime.adjustMonth
Beitrag von: Dubidu am 11.06.10 - 09:04:47
Könnte Dir dieser aktuelle Thread aus dem DominForum (http://www.dominoforum.de/modules/newbb/viewtopic.php?topic_id=21775&forum=55) helfen?

Die NotesDateTime-Klasse ist eh meist überbewertet bzw. unnötig. Du kannst auch simpel mit der Datumsseriennummer rechnen:
Code
	Dim vStart As Variant
	
	vStart = Datenumber (2010, 12, 1)
	
	Messagebox Datenumber (Year (vStart), Month (vStart) + 1, 1)

Du siehst, das funktioniert sogar im Dezember  ;)

Bernhard

Danke, netter Workaround, aber wie kann ich in deinem Beispiel die Uhrzeit einbinden?!

EDIT: Habe das nun mit CDat gelöst.

Liebe Grüße
Giordano
Titel: Re: NotesDateTime.adjustMonth
Beitrag von: koehlerbv am 11.06.10 - 09:07:17
Wie das genau programmiert wurde, weiss ich leider auch nicht, aber eine gewisse "Intelligenz" oder "Fehlertoleranz" wurde dem Code ganz gewiss mitgegeben: Monat #13 gibt es nicht, ergo ist es der folgende Monat 1.

Zudem ist das Datum ja nichts weiter als eine Zahl, die erst durch die Konvertierung wie beispielsweise nach String durch Messagebox wieder in ein für uns erkennbares Format gebracht wird.

Leichter verständlich wird dies m.E. durch solchen einen Term:
Messagebox Datenumber (2010, 6, 1 + 30)

Bernhard
Titel: Re: NotesDateTime.adjustMonth
Beitrag von: koehlerbv am 11.06.10 - 09:16:33
In Deinem Beispiel im 1. Post hast Du 0:00 Uhr angegeben, Giordano. Das kommt bei mir auch heraus, da LS-Variants wie oben gezeigt immer als 0:00 Uhr interpretiert werden.
Ansonsten gilt weiter das gesagte: Datums-/Zeitwerte sind nur eine Zahl. Du kannst zu vStart einfach Timenumber (9, 16, 22) addieren oder auch 0,25 (für 6:00 Uhr) etc. pp.

Bernhard
Titel: Re: NotesDateTime.adjustMonth
Beitrag von: BigWim am 11.06.10 - 09:59:18
Zitat
Wie das genau programmiert wurde, weiss ich leider auch nicht, ...
Das wär was.

Zitat
Leichter verständlich wird dies m.E. durch solchen einen Term:
Messagebox Datenumber (2010, 6, 1 + 30)
Stimmt, warum einfach, wenn es auch kompliziert geht. Werde mich damit weiter beschäftigen, damit sich wenigstens ein paar Fragezeichen auflösen ...

Danke!
Markus
Titel: Re: NotesDateTime.adjustMonth
Beitrag von: Dubidu am 11.06.10 - 11:17:30
OK, ich sehe gerade, dass Variant-DateTime seine eigenen Probleme mitbringt...

Code
Dim vExpectedNDT As Variant

vExpectedNDT = DateNumber( 2007, 1, 31)
vExpectedNDT = DateNumber( Year(vExpectedNDT), Month(vExpectedNDT) + 1, 31)
		
Print vExpectedNDT

Wenn ich den 31.01.2007 um einen Monat verschiebe, erhalte ich mit Variant-DateTime 03.03.2007 und mit NotesDateTime 28.02.2007 als Ergebnis. NotesDateTime erscheint mit hier korrekter. Wie soll ich damit umgehen?!

EDIT:
Übrigens funktioniert folgender Code wunderbar, wenn man bei adjustMonth den Parameter True mitgibt:

Code
Dim ndt As New NotesDateTime("01.05.2007 00:00")
	
Call ndt.AdjustMonth(1, True)
	
Msgbox ndt.LSLocalTime
Titel: Re: NotesDateTime.adjustMonth
Beitrag von: koehlerbv am 11.06.10 - 11:22:59
Falsche Herangehensweise - immer an die Zahl als Datum denken!

ExpectedNDT = DateNumber( Year(vExpectedNDT), Month(vExpectedNDT) + 2, 1) - 1

Bernhard
Titel: Re: NotesDateTime.adjustMonth
Beitrag von: Dubidu am 11.06.10 - 11:37:34
Falsche Herangehensweise - immer an die Zahl als Datum denken!

ExpectedNDT = DateNumber( Year(vExpectedNDT), Month(vExpectedNDT) + 2, 1) - 1

Bernhard

Danke, für deine Antwort, aber das ist leider eine Einzelfallbehandlung.
Wie würdest du das hier anwenden?!

Code
For iMonth = 1 To 12
	For iDay = 1 To 31
		vExpectedNDT = DateNumber( 2007, iMonth, iDay)
		vExpectedNDT = DateNumber( Year(vExpectedNDT), Month(vExpectedNDT) + 1, iDay) + TimeNumber(00, 59, 00)
		
		Print vExpectedNDT
	Next
Next
Titel: Re: NotesDateTime.adjustMonth
Beitrag von: koehlerbv am 11.06.10 - 15:27:13
Das ist jetzt aber eine ganz andere Baustelle, Giordano!
Hier musst Du natürlich selbst für die Logik sorgen und prüfen, ob es den derzeitigen Kalendertag (29, 30, 31) überhaupt im Folgemonat gibt. Erst dann kannst Du das neue Datum im Folgemonat berechnen.

Bernhard
Titel: Re: NotesDateTime.adjustMonth
Beitrag von: sheponion am 03.04.14 - 16:53:03
Hallo, Thema ist zwar schon alt, aber ich hätte noch folgende Infos dazu, falls jemand, so wie ich, mal wieder per Google darauf stößt: