@delphi_fan — o ile istnieje zgodność pomiędzy Delphi w wersji którą posiadasz a FPC, Twój kod wcale nie podstawia zdefiniowanego separatora. Czyli taki kod:
// Twoja część
System.SysUtils.FormatSettings.ShortDateFormat:= 'yyyy-MM-dd';
System.SysUtils.FormatSettings.DateSeparator:='-';
// przykładowe wyświetlenie daty
WriteLn(FormatDateTime(SysUtils.FormatSettings.ShortDateFormat, Now()));
co prawda wyświetli wartość 2016-02-21
, jednak bez zdefiniowania DateSeparator
, program także wyświetli datę ze znakami -
. Powtarzam jeszcze raz — o ile istnieje zgodność (niestety sam nie mam jak tego sprawdzić), znak -
nie jest domyślnym znakiem separatora daty, więc funkcja konwertująca (w tym przypadku użyta FormatDateTime) w ogóle nie rozpozna znaku -
i go po prostu przepisze.
Dla przykładu, poniższy kod:
SysUtils.FormatSettings.ShortDateFormat := 'YYYY-MM-DD';
SysUtils.FormatSettings.DateSeparator := '|';
WriteLn(FormatDateTime(SysUtils.FormatSettings.ShortDateFormat, Now()));
nie podstawi w miejsce -
zdefiniowanego separatora daty. Natomiast jeśli użyjemy w masce ShortDateFormat
jednego ze znaków domyślnych — czyli /
— funkcja konwertująca wstawi w jego miejsce znak zdefiniowany:
SysUtils.FormatSettings.ShortDateFormat := 'YYYY/MM/DD';
SysUtils.FormatSettings.DateSeparator := '|';
WriteLn(FormatDateTime(SysUtils.FormatSettings.ShortDateFormat, Now()));
Taki kod spowoduje wyświetlenie w konsoli daty w postaci 2016|02|21
, czyli z użyciem znaku z pola DateSeparator
.
Analizując dogłębniej, każdy łańcuch znaków określający długi lub krótki format daty i/lub czasu może zawierać dodatkowe nieformatowane podciągi, nawet jakieś kosmiczne wartości. Poniższy kod:
SysUtils.FormatSettings.ShortDateFormat := '"rok "YYYY", miesiac "MM" i dzien "DD';
WriteLn(FormatDateTime(SysUtils.FormatSettings.ShortDateFormat, Now()));
wygląda dziwnie, jednak jest to dozwolone. Co zostanie wyświetlone w konsoli? To:
rok 2016, miesiac 02 i dzien 21
Dlaczego? Bo znakami "
obejmuje się podciągi, które są przepisywane do łańcucha wyjściowego. To jedna z wielu ficzerów dotyczących formatowania łańcuchów. Jeżeli nie używa się znaków cudzysłowu to wszystkie znaki nieokreślające formatowania którejść składowej zostaną przepisane (o ile znaki te są neutralne).
Kolejny przykład:
SysUtils.FormatSettings.ShortDateFormat := '-.,YYYY-.,MM.,-DD-;%';
WriteLn(FormatDateTime(SysUtils.FormatSettings.ShortDateFormat, Now()));
Maska zawiera znaki nautralne — znaki -
, .
i ,
— więc na wyjściu dostaniemy wartość -.,2016-.,02.,-21-;%
.
Dlaczego o tym wspominam — jeśli potrzebujesz użyć własnoręcznie zdefiniowanego separatora składowych daty w skróconej wersji formatu daty, znaku który jest inny niż domyślny, to albo użyj go od razu w łańcuchu maski:
SysUtils.FormatSettings.ShortDateFormat := 'YYYY-MM-DD'; // tyle wystarczy
albo użyj w masce znaku domyślnego (znaku /
) i ustaw swój własny znak w odpowiednim polu:
SysUtils.FormatSettings.ShortDateFormat := 'YYYY/MM/DD'; // tu wykorzystanie domyślnego separatora
SysUtils.FormatSettings.DateSeparator := #10; // tu zdefiniowanie własnego, który zostanie podstawiony
O ile Delphi w ten sam sposób wykorzystuje FormatSettings
co FPC — ten post powinien być dla Ciebie pomocny. A jeśli istnieją różnice — coż, pozostanie jako ciekawostka dla programujących pod FPC.