Leniwce.com | blog technologiczny
Konwersja dat na liczby (ponownie, tym razem w C#)
Bartosz Lewandowski, 2009-05-18 23:10:30
kategoria: C#

Niedawno pisałem na temat konwersji dat na wartości liczbowe i odwrotnie, wykorzystując komendy serwera SQL (w tym wypadku serwer Microsoft SQL Server). Pokazałem jak stworzyć storowane procedury, które będą ułatwiały te przekształcenia. Jednak przydatna może okazać się konwersja na liczbę jeszcze w aplikacji, przed zapisaniem jej do bazy.

Artykuł powiązany: MS SQL Konwersja dat na liczby i odwrotnie

.Net udostępnia obiekty DateTime oraz TimeSpan, których metody właściwie w całości rozwiązują nasz problem. W przykładzie, który napiszę przy wykorzystaniu C#, zmienna start oznaczać będzie czas początkowy. Umówmy się, że to będzie 2001-01-01.
Zadeklarujmy więc zmienną, jednocześnie nadając jej czas początkowy:

DateTime start = new DateTime(2001, 01, 01);

Będę obliczać różnicę pomiędzy datą bieżącą a datą startową. Różnicę wyliczę w „tyknięciach” (ticks), gdzie jeden tick reprezentuje sto nanosekund, czyli jest dziesięć „tyknięć” w milisekundzie.

long elapsed = DateTime.Now.Ticks - start.Ticks;

Teraz wystarczy tylko odpowiednio zaprezentować różnicę pomiędzy dwoma datami. Do tego służyć nam będzie obiekt TimeSpan, zadeklarujmy więc obiekt jednocześnie podając w konstruktorze różnicę w czasie:
TimeSpan diff = new TimeSpan(elapsed);

Pozostaje nam tylko wyświetlić różnicę w odpowiedniej jednostce czasu. Jeżeli chcemy w dniach, wywołamy metodę TotalDays, jeżeli w minutach TotalMinutes. Łatwo się domyślić, że dostępne są również inne jednostki (sekudny, godziny, milisekundy).

W naszym wypadku niech to będą dni:
MessageBox.Show(diff.TotalDays.ToString());

Efekt:

Część całkowita reprezetuje ilość dni, które upłynęłu (bo było TotalDays), część ułamkowa przechowuje część dnia, który trwa. Wartość 0.5 oznaczać będzie godzinę dwunastą (bo pół doby).

Zróbmy więc z tego funckję, którą zwróci nam czas podany w parametrze. Odrzucę części ułamkowę, interesuje mnie zapis ilości dni, które minęły. Całośc więc wygląda tak:

public static int DateTimeToDays(DateTime toConvert)
{
  DateTime start = new DateTime(2001, 01, 01);
            long elapsed = toConvert.Ticks - start.Ticks;
            TimeSpan diff = new TimeSpan(elapsed);
            return (int)diff.TotalDays;
}

Jak widać, argumentem funkcji jest zmienna typu DateTime, możemu więc wywołać naszą funkcję:
MessageBox.Show(DateTimeToDays(DateTime.Now).ToString());

Czy też jako paramert podać wartość przechowywaną w kontrolne DateTimePicker.

Powiązane artykuły
Atraktor Lorenza (2011-08-29)
Równoległy może więcej(?) - czyli kilka słów o Parallel.For (2011-02-06)
Święta, święta - czas pochwalić się (fraktalną) choinką (2010-12-25)
Własny wygaszacz ekranu (2010-06-03)
3.1415926535897932385... (2010-05-19)
Metody rozszerzające (2010-05-07)
GPS w lekkostrawnym sosie podany (2009-08-05)
Wszechświat na ekranie, czyli słowo o skalowaniu (2009-07-15)
OleDbConnection – Excel jako baza danych(C#) (2009-07-13)
Animacje 3D (OpenGL) (2009-07-05)


Komentarze
Brak komentarzy.

Dodaj komentarz:
Autor:*

WWW:

Treść:*

Wprowadź kod zabezpieczający*:


        * - pola wymagane
Kategorie
C# (13)
Inne (6)
Java (3)
Matlab (1)
OpenGL (1)
PHP (2)


Najnowsze wpisy

Ostatnie komentarze