In der Registry unter:
HKEY_CURRENT_USER\Control Panel\International\Calendars\TwoDigitYearMax
finde ich einige Einträge, aber nur, wenn der User diese Angabe in
"Regionale Einstellungen anpassen" geändert und übernommen hat.
Ich könnte jetzt davon ausgehen, dass da immer 2029 voreingestellt ist
(bis W7 ist das auch so). Bleibt das aber auch bei künftigen OS so?
Gruß
Wilfried
Davon kannst Du nicht ausgehen.
Warum also nicht einen kleinen Test schreiben,
um die auf dem System aktuell güligen Einstellungen
(in einem kleinen Loop vielleicht) abzuchecken.
Oder erst gar nicht darauf verlassen - und Deine
eigene "wo-läuts über"-Methode für die "Expansion
auf 4stellige Jahre" implementieren.
Olaf
Ergibt sich die Frage, warum Du das benᅵtigst. Meiner Ansicht nach
kannst Du Dich doch einfach auf cdate verlassen. cdate("Tag.Monat." &
ZweistelligeJahreszahl) gibt Dir doch immer das korrekte gewᅵnschte
Datum entsprechend den Systemeinstellungen?
Function IsLastCentury(ByVal twodigityear As Integer) As Boolean
Dim lastyear As Integer
Dim checkyear As Integer
lastyear = Year(Now)
checkyear = Year(CDate("1.1." & twodigityear))
IsLastCentury = (Mid$(CStr(lastyear), 1, 2) <> Mid$(CStr(checkyear),
1, 2))
End Function
Gert
--
"Probleme kann man niemals mit derselben Denkweise lᅵsen, durch die sie
entstanden sind."
Albert Einstein
da die Benutzer meiner SW bei Datumsangaben auch z.B.
10111 oder 10198 bzw. in dem Fall sogar 1111 oder 1198
eingeben können und ich das bis dto. per Hand in
01.01.2011 oder 01.01.1998 aufgedröselt habe, werde
ich wohl entweder Windows selbst die Umwandlung überlassen,
in dem ich dafür nur bis 01.01.11 oder 01.01.98 aufdrösle und
dann VB (Format$ & Co.) bemühe oder ich mach es so,
das der Benutzer das "Übergangsjahr" in meiner und
für meine SW angeben und speichern kann.
Gruß
Wilfried
Bei diesen Eingaben musst Du ja auch Tag, Monat und Jahr splitten, um
ein Datum zu bekommen (10111 = 10.01.11 oder 01.01.11 oder 10.11.01 ?,
wie auch immer), also verwendest Du dafür ja schon eine fertige Routine.
Und das richtige Datum (mit Jahrhundertwechsel) entsprechend den
Systemeinstellungen bekommst Du mit diesen Angaben doch dann ganz
einfach mit DateSerial(Jahr,Monat,Tag) ;-)
Gert
--
"Probleme kann man niemals mit derselben Denkweise lösen, durch die sie
entstanden sind."
Albert Einstein
... das passtschooo :-)
Danke und Gruß
Wilfried
> Da ich das Jahr, wenn es Jahr zweistellig angegeben
> wird (wie auch immer), zweistellig zur Verfügung habe,
> bekomme ich das "richtige" vierstellige Jahr durch
> die Function Year(CDate("1.1."& twodigityear))
> geliefert und kann es verwenden.
Yep - wusste nicht, dass es Dir nur um das Arbeiten
mit den aktuellen Sys-Einstellungen ging.
In der Funktion oben ist CDate auch nicht unbedingt
notwendig - Year() kommt (ebenso wie CDate) auch
direkt mit dem String klar.
Ich dachte Du wolltest darauf hinaus, eher die
(unter der Haube dabei berücksichtigte) akt.
JahresSwitch-Systemeinstellung auszulesen, *ohne*
dabei die Registry-APIs zu bemühen .
Hier jedenfalls das was ich meinte mit meinem
Loop-Vorschlag (falls Dich in Deiner App irgendwann
doch interessieren sollte, wo die aktuelle Grenze ist):
'bestimmt das Maximum desjenigen zweistellige Jahrs,
'bis zu dem noch auf "2000 zugehörig" erkannt wird -
'zweistellige Jahre die *über* dem ausgeworfenen Ergebnis
'liegen, werden dagegen "1900 zugeteilt"
Function GetMaxTwoDigitYearIn2000() As Long
Dim i As Long
Do Until Year("1.1." & i + 9) < 2000: i = i + 9: Loop
Do Until Year("1.1." & i + 1) < 2000: i = i + 1: Loop
GetMaxTwoDigitYearIn2000 = i
End Function
Der zweigeteilte Skip-Loop oben (beginnend mit den 9er-
Schrittweiten) reduziert die Anzahl der insgesamt
nötigen Tests auf in Summe nur fünf (wenn wie bei mir
29 als Switch-Jahr im System eingestellt ist).
Wenn man den oberen Loop auskommentiert, funktioniert
das Ganze natürlich ebenso - nur dass dann halt die
vollen 29 Einzel-Inkrement-Tests zu Buche schlagen
würden. Wäre aber so oder so nicht unbedingt ein
Performancefresser.
Olaf
War nur als Beispiel gedacht und passt nicht, wenn Du internationale
Datumsformate berücksichtigen musst - dann muss für cdate und/oder year
ein String auch im Textformat für zulässige Datumsangaben lt.
Systemeinstellungen liegen.
year(dateserial(towdigityear,1,1))
dagegen funktioniert auch dann..
> > bekomme ich das "richtige" vierstellige Jahr durch
> > die Function Year(CDate("1.1."& twodigityear))
> > geliefert und kann es verwenden.
>
> Yep - wusste nicht, dass es Dir nur um das Arbeiten
> mit den aktuellen Sys-Einstellungen ging.
Ich hatte bis dto. eine "feste" Funktion al'a:
Private Function FourDigitYear(TwoDigitYear as string) as string
If TwoDigitYear > 29 then
FourDigitYear = cstr(1900 + val(TwoDigitYear))
else
FourDigitYear = cstr(2000 + val(TwoDigitYear))
end if
End Function
Nun dachte ich, ich br�uchte die aktuelle Sys-Einstellg. um
dies korrekter zu machen. Ich bin nicht darauf gekommen
Windows dazu zuverwenden.
> In der Funktion oben ist CDate auch nicht unbedingt
> notwendig - Year() kommt (ebenso wie CDate) auch
> direkt mit dem String klar.
Da ich TwoDigitYear als String vorliegen habe und keine
internationalen Datumsformate ber�cksichtigen muss,
verwende bzw. verwendete ich:
Private Function FourDigitYear(TwoDigitYear as string) as string
FourDigitYear = Format$("1/1/" & TwoDigitYear, "yyyy")
End Function
Wobei ich denke, dass diese Function genug international ist.
Um allen Eventualit�ten aus dem Wege zu gehen, habe ich auf
die von Gert vorgeschlagene Funktion umgestellt und sieht
in etwa so aus.
Private Function FourDigitYear(TwoDigitYear as string) as string
dim iTDY as integer
iTDY = val(TwoDigitYear)
FourDigitYear = cstr(year(dateserial(iTDY,1,1)))
End Function
> Ich dachte Du wolltest darauf hinaus, eher die
> (unter der Haube dabei ber�cksichtigte) akt.
> JahresSwitch-Systemeinstellung auszulesen, *ohne*
> dabei die Registry-APIs zu bem�hen .
Ja, ich dachte das br�uchte ich f�r die Umwandlung.
> Hier jedenfalls das was ich meinte mit meinem
> Loop-Vorschlag (falls Dich in Deiner App irgendwann
> doch interessieren sollte, wo die aktuelle Grenze ist):
>
>
> 'bestimmt das Maximum desjenigen zweistellige Jahrs,
> 'bis zu dem noch auf "2000 zugeh�rig" erkannt wird -
> 'zweistellige Jahre die *�ber* dem ausgeworfenen Ergebnis
> 'liegen, werden dagegen "1900 zugeteilt"
> Function GetMaxTwoDigitYearIn2000() As Long
> Dim i As Long
> Do Until Year("1.1." & i + 9) < 2000: i = i + 9: Loop
> Do Until Year("1.1." & i + 1) < 2000: i = i + 1: Loop
> GetMaxTwoDigitYearIn2000 = i
> End Function
Das funktioniert nat�rlich, aber brauche ich nun doch nicht.
Danke u. Gru�
Wilfried
> > Jahr durch die Function
> > Year(CDate("1.1." & twodigityear))
> > geliefert und kann es verwenden.
> >
> > ... das passtschooo :-)
>
> War nur als Beispiel gedacht und passt nicht, wenn Du internationale
> Datumsformate ber�ソスcksichtigen musst - dann muss f�ソスr cdate und/oder year
> ein String auch im Textformat f�ソスr zul�ソスssige Datumsangaben lt.
> Systemeinstellungen liegen.
>
> year(dateserial(towdigityear,1,1))
Ja, OK das passt noch besser.
Ich habe TwoDigitYear eh als String vorliegen, brauche als
R�ソスckgabewert wieder einen String und muss theoretisch keine
internationalen Datumsformate ber�ソスcksichtigen.
Deshalb hatte ich auch die Funktion nur vom Prinzip �ソスbernommen.
Meine sah so aus:
Private Function FourDigitYear(TwoDigitYear as string) as string
FourDigitYear = Format$("1/1/" & TwoDigitYear, "yyyy")
End Function
Wobei ich dachte, dass diese Function genug international ist bzw. war.
Jetzt so:
Private Function FourDigitYear(TwoDigitYear as string) as string
dim iTDY as integer
iTDY = val(TwoDigitYear)
FourDigitYear = cstr(year(dateserial(iTDY,1,1)))
End Function
Gru�ソス
Wilfried