Autor Thema: NotesDateTime.adjustMonth  (Gelesen 5500 mal)

Offline Dubidu

  • Aktives Mitglied
  • ***
  • Beiträge: 168
  • Geschlecht: Männlich
  • Eins, zwei, drei - eierlei!
NotesDateTime.adjustMonth
« 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: NotesDateTime.adjustMonth
« Antwort #1 am: 10.06.10 - 17:48:16 »
Könnte Dir dieser aktuelle Thread aus dem DominForum 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

BigWim

  • Gast
Re: NotesDateTime.adjustMonth
« Antwort #2 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


Offline Dubidu

  • Aktives Mitglied
  • ***
  • Beiträge: 168
  • Geschlecht: Männlich
  • Eins, zwei, drei - eierlei!
Re: NotesDateTime.adjustMonth
« Antwort #3 am: 11.06.10 - 09:04:47 »
Könnte Dir dieser aktuelle Thread aus dem DominForum 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
« Letzte Änderung: 11.06.10 - 09:14:04 von Dubidu »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: NotesDateTime.adjustMonth
« Antwort #4 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: NotesDateTime.adjustMonth
« Antwort #5 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

BigWim

  • Gast
Re: NotesDateTime.adjustMonth
« Antwort #6 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

Offline Dubidu

  • Aktives Mitglied
  • ***
  • Beiträge: 168
  • Geschlecht: Männlich
  • Eins, zwei, drei - eierlei!
Re: NotesDateTime.adjustMonth
« Antwort #7 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: NotesDateTime.adjustMonth
« Antwort #8 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

Offline Dubidu

  • Aktives Mitglied
  • ***
  • Beiträge: 168
  • Geschlecht: Männlich
  • Eins, zwei, drei - eierlei!
Re: NotesDateTime.adjustMonth
« Antwort #9 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: NotesDateTime.adjustMonth
« Antwort #10 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

Offline sheponion

  • Frischling
  • *
  • Beiträge: 5
Re: NotesDateTime.adjustMonth
« Antwort #11 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:

  • Der Fehler tritt im ersten des Monats auf, wenn die Uhrzeit 00:00:00 bis 00:59:59 beträgt, also nicht 1:00 Uhr überschreitet.
  • Der Fehler tritt auch nur in bestimmten Monaten auf, hier lässt sich aber kein genaues Verhalten ableiten.
  • Der Fehler tritt NICHT auf, wenn die Uhrzeit nachträglich mit SetAnyTime entfernt wird.
  • Der Fehler tritt NICHT auf, wenn das Datum per New NotesDateTime([Date-Variant oder String]) übergeben wird und die Uhrzeit dabei nicht angegeben wird oder genau 00:00:00 beträgt (wahrscheinlich kümmert sich die New-Routine darum, dass in diesem Fall auch die Uhrzeit komplett entfernt wird, wie bei SetAnyTime)
  • Der Fehler tritt aber auf, wenn das Datum per LSLocalTime gesetzt wird, egal ob mit oder ohne Uhrzeit
« Letzte Änderung: 03.04.14 - 17:20:58 von sheponion »

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz