Laden...

[gelöst] PowerShell: Unerwartete Ausgabe bei DateTimeFormat.AbbreviatedMonthNames

Erstellt von UncleBens vor 8 Jahren Letzter Beitrag vor 8 Jahren 662 Views
U
UncleBens Themenstarter:in
135 Beiträge seit 2009
vor 8 Jahren
[gelöst] PowerShell: Unerwartete Ausgabe bei DateTimeFormat.AbbreviatedMonthNames

Hoi zusammen,

bin grade über ein komisches Verhalten in PowerShell gestolpert, das ich mir nicht erklären kann.
Vielleicht kann mir einer von Euch auf die Sprünge helfen wo der Fehler liegt.
Ich möchte mir das aktuelle Monat im englischen Kurzformat (Jan, Feb, Mar...) ausgeben lassen - und zwar unabhängig von der im OS eingestellten Culture. Dabei ist mir aber aufgefallen, dass bei einigen Monaten sehr komische Ausgaben erzeugt werden:

$en = New-Object System.Globalization.Cultureinfo("en-US")

for ($i = 0; $i -lt 12; $i++) 
{
            Get-Date -format ($en.DateTimeFormat.AbbreviatedMonthNames[$i])
}

Ausgabe:

Jan
3eb
10ar
Apr
10a15
Jun
Jul
Aun. Chr.
Sep
Oc
Nov
Dec

Besonders strange ist der August 🤔 Aber auch Februar, März und Mai passen nicht.
Das Verhalten konnte ich auf jedem getesteten System nachvollziehen (einem deutschen Windows 7, einem englischen Windows 8 und einem ebenfalls englischen Windows Server 2008 R2).
Allerdings nur in PowerShell... eine simple C#-Konsolenanwendung verhält sich wie erwartet:


            CultureInfo en = new CultureInfo("en-US");
            DateTimeFormatInfo dtfi = en.DateTimeFormat;
            for (int i = 0; i < 12; i++ )
                Console.WriteLine(dtfi.AbbreviatedMonthNames[i]);

            Console.ReadLine();

Ausgabe:

Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec

Stelle ich mich an, oder ist das ein Bug in PowerShell?

Besten Dank schonmal und viele Grüße
Ben

5.658 Beiträge seit 2006
vor 8 Jahren

Hi SomeoneYouKnow,

der Unterschied zwischen den beiden Codeausschnitten ist der Aufruf von Get-Date -format in der Powershell-Version. Offenbar wird da der Rückgabewert nochmal in ein Datum umgewandelt(?). Aber eigentlich willst du ja nur den Inalt von $en.DateTimeFormat.AbbreviatedMonthNames[$i] ausgeben...

Christian

Weeks of programming can save you hours of planning

U
UncleBens Themenstarter:in
135 Beiträge seit 2009
vor 8 Jahren

Hoi Christian,

oh Mann... ein Klassiker von "den Wald vor lauter Bäumen nicht sehen", Du hast natürlich Recht.

Ich hatte den Codeschnippsel aus einem Technet-Blog, dort war's im Original:

$de = New-Object system.globalization.cultureinfo("de-DE")
get-date -format ($de.DateTimeFormat.ShortDatePattern)

Und ich hatte es nur auf AbbreviatedMonthNames abgeändert ohne daran zu denken, dass ich mir das Get-Date dann sparen kann.

Besten Dank!

Ciao
Ben