Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Zweistellige Jahreszahl wird interpretiert als Jahr zwischen...

76 views
Skip to first unread message

Wilfried Dietrich

unread,
Aug 17, 2011, 9:05:10 AM8/17/11
to
Aus den "Ländereinstellungen" bzw. "regionale Einstellungen ..." benötige ich
die Angabe für "Eine zweistellige Jahreszahl wird interpretiert als Jahr zwischen:"
Wie / woher bekomme ich diese Angabe?

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


Schmidt

unread,
Aug 18, 2011, 12:53:43 AM8/18/11
to

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

G.Wietzorek

unread,
Aug 18, 2011, 4:51:38 AM8/18/11
to
Am 17.08.2011 15:05, schrieb Wilfried Dietrich:
> Aus den "Lᅵndereinstellungen" bzw. "regionale Einstellungen ..." benᅵtige ich
> die Angabe fᅵr "Eine zweistellige Jahreszahl wird interpretiert als Jahr zwischen:"

> Wie / woher bekomme ich diese Angabe?
>

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

Wilfried Dietrich

unread,
Aug 18, 2011, 8:29:01 AM8/18/11
to
Hallo Olaf und Gert,

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


G.Wietzorek

unread,
Aug 18, 2011, 9:19:01 AM8/18/11
to
Am 18.08.2011 14:29, schrieb Wilfried Dietrich:
> Hallo Olaf und Gert,
>
> 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,

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

Wilfried Dietrich

unread,
Aug 18, 2011, 9:53:39 AM8/18/11
to
Hallo Gert,
ich habe einiges getestet und denke jetzt, dass der Ansatz
aus Deinem anderen Posting schon das bringt, was ich möchte.
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.

... das passtschooo :-)

Danke und Gruß
Wilfried


Schmidt

unread,
Aug 18, 2011, 11:04:50 AM8/18/11
to
Am 18.08.2011 15:53, schrieb Wilfried Dietrich:

> 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

G.Wietzorek

unread,
Aug 18, 2011, 11:55:46 AM8/18/11
to
Am 18.08.2011 15:53, schrieb Wilfried Dietrich:
> 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))

dagegen funktioniert auch dann..

Wilfried Dietrich

unread,
Aug 19, 2011, 4:44:24 AM8/19/11
to
Hallo Olaf,

> > 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

Wilfried Dietrich

unread,
Aug 19, 2011, 4:50:21 AM8/19/11
to
Hallo Gerd,

> > 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


0 new messages