neděle 14. prosince 2008

Operátor formátování - 2. část

V minulém díle jsme se podívali na základy operátoru formátování. Dnes se budeme plně věnovat jeho kouzlům při práci s časovými položkami. Vzhledem k tomu, že v průběhu psaní článku jsem zjistil, že pro jeden díl je informací hodně, rozdělil jsem zpracování data do dvou pokračování. Dnes se podíváme na standardní formátování a příště na uživatelské.

Aktuální čas si nejdříve uložíme do proměnné, takže se nám budou lépe porovnávat výsledky všech operací:

PS C:\> $d = Get-Date
PS C:\> $d

1. prosince 2008 23:34:19


PS C:\>

Při základním použití operátoru -f dostaneme následující výstup:

PS C:\> "{0}" -f $d
1.12.2008 23:34:19
PS C:\> $d.GetTypeCode()
DateTime

Zároveň jsme si ověřili, že v proměnné d je uložen datový typ DateTime, takže můžeme začít provádět kouzla. Jestli se chcete podívat na různé varianty výstupu formátovacího operátoru, zkuste tento příkaz:

PS C:\> (Get-Date).GetDateTimeFormats()

Z minulého dílu víme, že obecný formát použití operátoru –f obsahuje také formátovací řetězec.

{index[,zarovnani][:formatovaciRetezec]}

formatovaciRetezec může v případě standardního formátování data nabývat osmnácti hodnot. Tyto hodnoty jsou zjednodušeně řečeno pouze aliasy pro uživatelský formát (definovaný systémem podle nastavení regionu). Pojďme si nejdříve ukázat všechny možnosti a poté je popíšeme podrobněji při současné lehké exkurzi do .NETu.

PS C:\> "{0:d}" -f $d
1.12.2008
PS C:\> "{0:D}" -f $d
1. prosince 2008
PS C:\> "{0:t}" -f $d
23:34
PS C:\> "{0:T}" -f $d
23:34:19
PS C:\> "{0:f}" -f $d
1. prosince 2008 23:34
PS C:\> "{0:F}" -f $d
1. prosince 2008 23:34:19
PS C:\> "{0:g}" -f $d
1.12.2008 23:34
PS C:\> "{0:G}" -f $d
1.12.2008 23:34:19
PS C:\> "{0:u}" -f $d
2008-12-01 23:34:19Z
PS C:\> "{0:U}" -f $d
1. prosince 2008 22:34:19
PS C:\> "{0:r}" -f $d
Mon, 01 Dec 2008 23:34:19 GMT
PS C:\> "{0:R}" -f $d
Mon, 01 Dec 2008 23:34:19 GMT
PS C:\> "{0:m}" -f $d
01 prosince
PS C:\> "{0:M}" -f $d
01 prosince
PS C:\> "{0:y}" -f $d
prosinec 2008
PS C:\> "{0:Y}" -f $d
prosinec 2008
PS C:\> "{0:s}" -f $d
2008-12-01T23:34:19
PS C:\> "{0:o}" -f $d
2008-12-01T23:34:19.8358768+01:00

Jedna vlastnost je jasná na první pohled - PowerShell v případě operátoru -f rozlišuje velikost písmen! První a druhý příklad tedy nejsou rovnocenné. V prvním (0:d) zobrazujeme datum ve formátu ShortDate, ve druhém (0:D) je použit LongDate formát. Kde se tento formát bere – a jak je definován – si ukážeme později. Příklady jsou řazeny do dvojic a proto si každou projdeme společně:
  • d, D - jak již bylo zmíněno, výstupem bude datum v krátkém (1.12.2008) nebo dlouhém formátu (1. prosince 2008)
  • t, T - zobrazuje tentokrát čas, opět v krátkém (23:34) nebo dlouhém formátu (23:34:19)
  • g, G - takzvaný obecný formát, je kombinací předchozích dvou formátů. Platí g = d t; G = d T
  • f, F - datum a čas v úplném formátu, rozdíl je v zobracení času, čili matematicky: f = D t; F = D T
  • u, U - univerzální setříditelný formát. U = F
  • r, R - oba dávají stejný výsledek, datum v RFC1123 formátu
  • m, M - zobrazuje den a měsíc, obě možnosti dávají shodný výsledek
  • y, Y - formát pro zobrazení roku a měsíce, obě možnosti dávají shodný výsledek
  • s - tříditelný formát
  • o - round-trip formát (Microsoft neuvádí překlad anglického termínu, ale můžeme jej interně nazvat jako "ten nejpodrobnější" :)
  • Jakýkoli jiný znak je brán jako neznámý a způsobí vyhození výjimky.
Zatím jsme brali jako fakt, že existují jakési formáty a pomocí uvedených formátovacích řetězců voláme jejich aliasy. Pojďme si podrobně projít první příklad.

PS C:\> "{0:d}" -f $d
1.12.2008


Jak již bylo řečeno, toto zobrazení používá krátký formát data. Anglicky řečeno, používá ShortDatePattern property. ShortDatePattern je jednou z vlastností .NET třídy DateTimeFormatInfo a každý systém ji definuje podle nastavení regionu. Jak zjistit naše nastavení? V PowerShellu existuje cmdlet Get-Culture, který nám s naším pátráním pomůže (výstup byl výrazně zkrácen).

PS C:\> Get-Culture | Get-Member

TypeName: System.Globalization.CultureInfo

DateTimeFormat Property System.Globalization.DateTimeFormatInfo DateTimeFormat

Vidíte typ DateTimeFormatInfo? Jsme evidentně na správné stopě. Zkusme se ještě trochu zanořit (opět zkráceno).

PS C:\> (Get-Culture).DateTimeFormat

ShortDatePattern : d.M.yyyy

A jsme téměř u cíle. ShortDatePattern je aliasem pro formát d.M.yyyy. Hmm, zajímavé, ale kde zjistíme, co znamená například yyyy? yyyy je jedním z dříve zmíněných uživatelských formátovacích řetězců, o kterých se budeme bavit příště. Nyní nám stačí informace že d. zobrazuje den ve tvaru 1. - M. zobrazuje měsíc ve tvaru 12. a yyyy rok jako 2008. Jaký formát je přiřazen konkrétnímu formátovacímu řetězci je možné najít v MSDN, ve zkratce se jedná o následující:
  • d – ShortDatePattern
  • D – LongDatePattern
  • t – ShortTimePattern
  • T – LongTimePattern
  • F – FullDateTimePattern
  • u – UniversalSortableDateTimePattern
  • r, R - RFC1123Pattern
  • m, M – MonthDayPattern
  • y, Y – YearMonthPattern
  • s – SortableDateTimePattern
Pro nastavení systému cs-CZ jsou formáty následující:

FullDateTimePattern : d. MMMM yyyy H:mm:ss
LongDatePattern : d. MMMM yyyy
LongTimePattern : H:mm:ss
MonthDayPattern : dd MMMM
RFC1123Pattern : ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
ShortDatePattern : d.M.yyyy
ShortTimePattern : H:mm
SortableDateTimePattern : yyyy'-'MM'-'dd'T'HH':'mm':'ss
UniversalSortableDateTimePattern : yyyy'-'MM'-'dd HH':'mm':'ss'Z'
YearMonthPattern : MMMM yyyy

Příště si povíme o uživatelských formátech a ukážeme si, co si představit například pod formátovacím řetězcem MM. Soubor s ukázkami dnešního dílu si můžete opět stáhnout.

Žádné komentáře: