DateTime

Wśród programistów funkcjonuje kilka takich .... skrótów myślowych, które nieodmiennie wprawiają mnie w zdumienie. Np. problem formatu liczby, lub jeszcze gorzej — formatu daty.

Pytanie, które słyszałem od wydawałoby się doświadczonych programistów zbyt wiele razy by mogło to być przypadkiem: "DateTime to w jakim formacie jest? w polskim czy amerykańskim?" I odpowiedź, której zawsze udzielam, mimo że wydaje mi się aż nadto oczywista: "w formacie daty". Skoro jakiś język programowania operuje na typie (klasie, strukturze, ...) "data" to jego wewnętrzna reprezentacja w pamięci programu jest absolutnie nie istotna (dla uproszczenia przyjmijmy, że problem roku 2000 mamy za sobą). Czy będzie to liczba sekund od 1 stycznia 1970, tekst czy cokolwiek innego — obiekt klasy "data" jest datą, obiekt klasy "data z godziną" jest datą z godziną i tyle. Natomiast jak ta data wygląda po konwersji na tekst, to już zupełnie inna bajka..

Jeśli pokaże się delikwentowi np. taki kawałek kodu (tu akurat C#, ale w każdym nowym i w miarę rozsądnym języku sytuacja będzie analogiczna):

Thread.CurrentThread.CurrentCulture = new CultureInfo("pl-PL");
Console.WriteLine(DateTime.Now);
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
Console.WriteLine(DateTime.Now);
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine(DateTime.Now);
Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
Console.WriteLine(DateTime.Now);
Thread.CurrentThread.CurrentCulture = new CultureInfo("vi-VN");
Console.WriteLine(DateTime.Now);
Thread.CurrentThread.CurrentCulture = new CultureInfo("th-TH");
Console.WriteLine(DateTime.Now);
Thread.CurrentThread.CurrentCulture = new CultureInfo("div-MV");
Console.WriteLine(DateTime.Now);

to wynik w postaci, np. takiej:

2004-04-11 18:22:46
11/04/2004 18:22:46
4/11/2004 6:22:46 PM
11.04.2004 18:22:46
11/04/2004 6:22:46 CH
11/4/2547 18:22:46
21/02/25 18:22

wcale nie jest zaskoczeniem. Rozsądek każe założyć, że wartość zwracana przez DateTime.Now jest wciąż taka sama, a jednak wypisywany wynik jest inny — czyli postać tekstowa nie jest cechą własną tego obiektu, raczej zależy od czegoś innego. I nagle sprawa wydaje się zupełnie jasna i oczywista...

Aż do następnego pytania lub odkrywczego stwierdzenia — "aaaa..., bo on przechowuje datę po amerykańsku, no to jasne, że to nie działa!". Nigdy "ja nie zadbałem o ustawienia regionalne", zawsze "on przechowuje inaczej niż powinien". Zgroza.

Komentarze

Brak komentarzy do tego wpisu.

 

Uwaga: Ze względu na bardzo intensywną działalność spambotów komentowanie zostało wyłączone po 60 dniach od opublikowania wpisu. Jeżeli faktycznie chcesz jeszcze skomentować skorzystaj ze strony kontaktowej.