Gdy chcemy odpowiednio wyświetlić datę lub godzinę w naszej aplikacji, może nam pomóc statyczna metoda Format klasy String. Standardowe specyfikatory dla daty to:
y- rok
M- miesiąc
d- dzień
h- godziny w formacie 12h
H- godziny w formacie 24h
m- minuty
s- sekundy
f- części sekundy
F- części sekundy końcowe zera są ucinane
t- zapis P.M lub A.M
z- sfera czasowa
Użycie metody Format klasy String daje nam możliwości zapisu każdej ze składowych daty w różnym formacie. Zacznijmy od możliwości zapisu dnia z daty. Aby to zrobić napiszmy prosty program „konsolowy”.
Data jaką będziemy formatować to 02.09.2015 19:04:05:33
W pierwszym przykładzie wyświetlmy dzień z daty w formacie jednej cyfry. Aby wyświetlić jedną cyfrę z daty musimy dodać spację po separatorze oznaczającym dzień( {0:d }) w przeciwnym razie zostanie wyświetlony inny format daty.

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2015, 9, 2, 19, 4, 5, 332);
           Console.WriteLine(String.Format("{0:d }", dateTime));
           Console.ReadLine();
        }

Oto wynik działania naszej aplikacji po kompilacji:

1

Rys. Wyświetlony dzień z daty

Jak widzimy został wyświetlony sam dzień z daty w postaci jednej liczby. W przypadku gdy liczba określająca dzień będzie składała się z dwóch cyfr zostaną one obie wyświetlone. W tym zapisie nie utracimy żadnych informacji. Przykład:

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2015, 9, 29, 19, 4, 5, 332);
           Console.WriteLine(String.Format("{0:d }", dateTime));
           Console.ReadLine();
        }

Oto wynik działania naszej aplikacji po kompilacji:

2

Rys. Wyświetlony dzień z daty

Jeżeli dzień z daty w formacie jednej cyfry nam nie odpowiada to możemy zapisać go w formacie dwucyfrowym. Aby to zrobić zastosujemy format {0:dd }

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2015, 9, 2, 19, 4, 5, 332);
           Console.WriteLine(String.Format("{0:dd }", dateTime));
           Console.ReadLine();
        }

Oto wynik działania naszej aplikacji po kompilacji:

3

Rys. Wyświetlony dzień z daty

Jak widzimy otrzymaliśmy dzień zapisany w formacie dwucyfrowej. W przypadku gdy dzień w dacie jest dwucyfrowy ten zapis nic nie zmienia zobaczmy przykład:

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2015, 9, 29, 19, 4, 5, 332);
           Console.WriteLine(String.Format("{0:dd }", dateTime));
           Console.ReadLine();
        }

Oto wynik działania naszej aplikacji po kompilacji:

4

Rys. Wyświetlony dzień z daty

Istnieje także możliwość zapisu dnia z daty w formacie słownym. W tym zapisie znajduje się nazwa dnia tygodnia. Możemy tę nazwę zapisać w postaci skróconej np. pn, wt, śr lub pełnej np. poniedziałek, wtorek, środa. Aby zapisać dzień w formacie skróconym należy napisać następujący format {0:ddd } . W przypadku pełnej nazwy format to {0:dddd } Zobaczmy przykład:

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2015, 9, 1, 19, 4, 5, 332);
           Console.WriteLine(String.Format("Dzień zapis skrócony {0:ddd }", dateTime));
           Console.WriteLine(String.Format("Dzień zapis pełny {0:dddd }", dateTime));
           Console.ReadLine();
        }

Rezultat działania aplikacji:

5

Rys. Wyświetlony dzień z daty w zapisie słownym

W przypadku zapisu miesiąca sytuacja wygląda analogicznie:
-{0:M } – jedna cyfra
-{0:MM } – dwie cyfry
-{0:MMM } – zapis słowny skrócony
-{0:MMMM } – zapis słowny pełny

Zobaczmy przykład:

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2015, 9, 1, 19, 4, 5, 332);
           Console.WriteLine(String.Format("Miesiąc jedna cyfra {0:M }", dateTime));
           Console.WriteLine(String.Format("Miesiąc dwie cyfry {0:MM }", dateTime));
           Console.WriteLine(String.Format("Miesiąc słownie zapis skrócony {0:MMM }", dateTime));
           Console.WriteLine(String.Format("Miesiąc słownie zapis pełny {0:MMMM}", dateTime));
           Console.ReadLine();
        }

Oto rezultat działania aplikacji:

6

Rys. Formatowanie miesiąca

W przypadku zapisu roku mamy następujące możliwości:
-{0:Y } – jedna cyfra
-{0:YY } – dwie cyfry
-{0:YYYY } – pełny zapis

Zobaczmy przykład:

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2005, 9, 1, 19, 4, 5, 332);
           Console.WriteLine(String.Format("Rok jedna cyfra {0:y }", dateTime));
           Console.WriteLine(String.Format("Rok dwie cyfry {0:yy }", dateTime));
           Console.WriteLine(String.Format("Rok pełen zapis {0:yyyy }", dateTime));
           Console.ReadLine();
        }

Oto rezultat działania aplikacji:

7

Rys. Formatowanie roku

W przypadku gdy końcówka zapisu roku jest liczbą dwucyfrową to aby nie stracić danych zostaje ona wyświetlona w całości w postaci zapisu w formacie jedno cyfrowym. Zobaczmy przykład:

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2015, 9, 1, 19, 4, 5, 332);
           Console.WriteLine(String.Format("Rok jedna cyfra {0:y }", dateTime));
           Console.WriteLine(String.Format("Rok dwie cyfry {0:yy }", dateTime));
           Console.WriteLine(String.Format("Rok pełen zapis {0:yyyy }", dateTime));
           Console.ReadLine();
        }

Oto rezultat działania aplikacji:

8

Rys. Formatowanie roku

Godzinę możemy zapisać w dwóch formach zapisu 12h oraz zapisu 24h.
Formatowanie dla zapisu 12h:
-{0:h } – jedna cyfra
-{0:hh } – dwie cyfry

Formatowanie dla zapisu 24h:
-{0:H } – jedna cyfra
-{0:HH } – dwie cyfry

W formatowaniu 24h istnieje ta sama zasada co do cyfr w liczbie godzin, jeżeli są dwie zostaną one wyświetlone w całości nawet w przypadku zapisu jednocyfrowego. Zobaczmy przykład:

Oto rezultat działania aplikacji:

9

Rys. Formatowanie godziny

W przypadku zapisu 12h możemy dołożyć dodatkową informację czy wyświetlana godzina jest rano czy popołudniu zapis AM PM. Możemy to zrobić na dwa sposoby. W pierwszym musimy zmienić informacje na temat regionu w jakim się znajdujemy, a następnie użyjemy standardowego zapisu za pomocą metody Format klasy String, zobaczmy przykład:

     static void Main(string[] args) {
           System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
           DateTime dateTime = new DateTime(2015, 9, 1, 19, 4, 5, 332);
           Console.WriteLine(String.Format("Godzina w formacie 12h {0:hh:mm:ss  tt }", dateTime));
           Console.ReadLine();
        }

Oto rezultat działania aplikacji:

10

Rys. Formatowanie godziny

Drugim sposobem jest użycie metody ToString() klasy DataTime z dodatkowym parametrem, który ustawi nam region na niezmienny. Oto przykład:

static void Main(string[] args) {
           DateTime dateTime = new DateTime(2015, 9, 1, 19, 4, 5, 332);
           Console.WriteLine("Godzina w formacie 12h :" + dateTime.ToString(" HH:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture));  
           Console.ReadLine();
        }

Rezultat działania aplikacji:

11

Rys. Formatowanie godziny

Jak widzimy dodaliśmy zapis PM lub AM do zapisu godziny jednak wiązało się to z zmianą informacji o regionie.

Minuty i sekundy możemy zapisać w formacie dwucyfrowym lub jednocyfrowym:
Minuty:
-{0:m } – jedna cyfra
-{0:mm } – dwie cyfry

Sekundy:
-{0:s } – jedna cyfra
-{0:ss } – dwie cyfry

Oczywiście w przypadku minut i sekund obowiązuje ta sama zasada cyfr w zapisie jednocyfrowym co w przypadkach powyżej. Zobaczmy przykład:

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2015, 9, 1, 19, 4, 5, 332);
           Console.WriteLine(String.Format("Minuta  jedna cyfra   {0:m }", dateTime));
           Console.WriteLine(String.Format("Minuta  dwie cyfry    {0:mm }", dateTime));
           Console.WriteLine(String.Format("Sekunda  jedna cyfra  {0:s }", dateTime));
           Console.WriteLine(String.Format("Sekunda  dwie cyfry   {0:ss }", dateTime));
           Console.ReadLine();
        }

Oto rezultat działania aplikacji:

12

Rys. Formatowanie minut i sekund

Gdy chcemy zapisać części sekundy możemy to zrobić w następujący sposób:
-{0:f } – jedna cyfra
-{0:ff } – dwie cyfry
-{0:fff } – trzy cyfry
-{0:ffff } – cztery cyfry
-{0:fffff } – pięć cyfr
-{0:ffffff } – sześć cyfr
-{0:fffffff } – siedem cyfr (maksymalna liczba cyfr)

Zobaczmy przykład:

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2015, 9, 1, 19, 4, 5, 332);
           Console.WriteLine(String.Format("Części sekundy jedna cyfra   {0:f }", dateTime));
           Console.WriteLine(String.Format("Części sekundy  dwie cyfry    {0:ff }", dateTime));
           Console.WriteLine(String.Format("Części sekundy trzy cyfry  {0:fff }", dateTime));
          Console.WriteLine(String.Format("Części sekundy siedem cyfr   {0:fffffff }", dateTime));
           Console.ReadLine();
        }

Oto rezultat działania aplikacji:

13

Rys. Formatowanie części sekundy

Stosując format używający dużej litery F ({0:F}) pozbędziemy się nieznaczących zer zobaczmy przykład:

static void Main(string[] args) {            
           DateTime dateTime = new DateTime(2015, 9, 1, 19, 4, 5, 332);
           Console.WriteLine(String.Format("Części sekundy jedna cyfra   {0:F }", dateTime));
           Console.WriteLine(String.Format("Części sekundy  dwie cyfry   {0:FF }", dateTime));
           Console.WriteLine(String.Format("Części sekundy trzy cyfry    {0:FFF }", dateTime));
          Console.WriteLine(String.Format("Części sekundy siedem cyfr   {0:FFFFFFF }", dateTime));
          }

Oto rezultat działania aplikacji:

14

Rys. Formatowanie części sekundy

Aby dodać informacje o strefie czasowej używamy następującego formatu:
-{0:z } – jedna cyfra
-{0:z } – dwie cyfry
-{0:zzz } – pełen zapis

Zobaczmy przykład:

static void Main(string[] args) {
            DateTime dateTime = new DateTime(2015, 9, 1, 19, 4, 5, 332);
            Console.WriteLine(String.Format("Strefa czasowa jedna cyfra   {0:z }", dateTime));
            Console.WriteLine(String.Format("Strefa czasowa  dwie cyfry    {0:zz }", dateTime));
            Console.WriteLine(String.Format("Strefa czasowa pełen zapis  {0:zzz }", dateTime));

            Console.ReadLine();
        }

Oto rezultat działania aplikacji:

15

Rys. formatowanie strefy czasowej

Zapis pełnej daty

W przykładach powyżej skupialiśmy się na poszczególnych częściach składowych daty. Dzięki temu wiemy jak możemy formatować każdą jej część. Aby zapiać pełną datę wystarczy wpisać interesujące nas części daty oddzielając je separatorem np.: {0:HH mm ss dd:MM:yyyy } lub {0:dd.MM.yyyy}. Zobaczmy przykład:

static void Main(string[] args) {
            DateTime dateTime = new DateTime(2015, 9, 30, 19, 4, 5, 332);
            Console.WriteLine(String.Format("zapis 1 {0: HH mm ss dd  MM yyyy }", dateTime));
            Console.WriteLine(String.Format("zapis 2 {0:HH:mm:ss dd-MM-yyyy }", dateTime));
            Console.WriteLine(String.Format("zapis 3 {0:HH-mm-ss dd-MM-yyyy }", dateTime));
            Console.WriteLine(String.Format("Godzina {0:HH-mm-ss} data {0:dd.MM.yyyy}  dzień tygodnia {0:dddd } miesiąc  {0:MMMM }", dateTime)); 
            Console.ReadLine();
        }

Oto rezultat działania aplikacji:

16

Rys. Przykład formatowania daty

Standardowe formaty daty

Gdy nie chcemy sami ustalić formatu wyświetlania daty możemy skorzystać z któregoś z standardowego zapisu:
-{0:t} krótki zapis godziny
-{0:T} długi zapis godziny
-{0:d} krótki zapis daty
-{0:D} długi zapis daty
-{0:f} długi zapis daty i krótki godziny format słowny
-{0:F} długi zapis daty i długi godziny format słowny
-{0:g} długi zapis daty i długi godziny format liczbowy
-{0:G} długi zapis daty i długi godziny format liczbowy
-{0:y} słownie miesiąc, rok
-{0:m} dzień słownie miesiąc
-{0:u} format UniversalSortableDateTime
-{0:s} format SortableDateTime
-{0:r} zapis w formacie RFC1123
Zobaczmy przykład:

static void Main(string[] args) {
            DateTime dateTime = new DateTime(2015, 9, 30, 19, 4, 5, 332);
            Console.WriteLine(String.Format("{0:t} krótki zapis godziny", dateTime));
            Console.WriteLine(String.Format("{0:T} długi zapis godziny", dateTime));
            Console.WriteLine(String.Format("{0:d} krótki zapis daty", dateTime));           
            Console.WriteLine(String.Format("{0:D} długi zapis daty", dateTime));
            Console.WriteLine(String.Format("{0:f} długi zapis daty i krótki godziny format słowny", dateTime));
            Console.WriteLine(String.Format("{0:F} długi zapis daty i długi godziny format słowny", dateTime));
            Console.WriteLine(String.Format("{0:g} długi zapis daty i długi godziny format liczbowy", dateTime));
            Console.WriteLine(String.Format("{0:G} długi zapis daty i długi godziny format liczbowy", dateTime));
            Console.WriteLine(String.Format("{0:y} słownie miesiąc, rok", dateTime));            
            Console.WriteLine(String.Format("{0:m} dzień słownie miesiąc", dateTime));
            Console.WriteLine(String.Format("{0:u} format UniversalSortableDateTime", dateTime));
            Console.WriteLine(String.Format("{0:s} format  SortableDateTime", dateTime));
            Console.WriteLine(String.Format("{0:r} zapis w formacie  RFC1123", dateTime));
            Console.ReadLine();
        }

rezultat działania aplikacji:

17

Rys. Standardowe formaty danych

Użycie metody ToString()

Wymienione separatory formatowania daty, możemy także zastosować w metodzie ToStrig() klasy DateTime, zobaczmy przykład:

  static void Main(string[] args) {
            DateTime dateTime = new DateTime(2015, 9, 30, 19, 4, 5, 332);
            Console.WriteLine( dateTime.ToString("HH:mm:ss:ffff - dddd:MMMM:yyyy"));            
            Console.ReadLine();
        }

Oto rezultat działania aplikacji:

18

Rys. Formatowanie daty

Podsumowanie:
Mamy wiele możliwości zapisu daty poprzez metodę Format klasy string oraz metodę ToString() klasy DataTime. Dzięki temu możemy zapisać datę w interesującym nas formacie. Należy jednak pamiętać o regionie w jakim się znajdujemy i związanych z nim formatem daty lub separatora.