Loading Likes...
Witaj,
Artykuł ten poświęcony jest praktycznemu zastosowaniu wbudowanych klas DateTime i TimeSpan.
Zdecydowana większość z nas natrafiająca na materiały w sieci szuka kodu. Dlatego też w tym artykule mało będzie teorii a skupie się wyłącznie na praktycznym zastosowaniu.
Gdzie znajdują się klasy DateTime i TimeSpan?
W biblitece systemowej.
Jak prawidłowo przechowywać daty?
Konwencje programistyczne mówią, żeby przechowywać je w uniwersalnym formacie UTC, czyli dla Polski godzinę do tyłu. Aby osiągnąć taki rezultat możemy skorzystać z parametru UtcNow w klasie DateTime.
|
DateTime data = DateTime.UtcNow; Console.WriteLine(data); //Otrzymamy: //22-Feb-18 19:58:52 //W Polsce obecnie jest 20:58:52 |
Jak uzyskąć prawidłową datę i godzinę dla Polski?
W tym celu wystarczy wywołać na parametrze UtcNow metodę ToLocalTime() – Metoda ta pobierze godzinę, na podstawie strefy czasowej maszyny, na której uruchomiony jest program. W moim przypadku jest to Polska.
|
var lokalnaData = DateTime.UtcNow.ToLocalTime(); Console.WriteLine(lokalnaData); //22-Feb-18 21:01:05 // W Polsce obecnie jest godzina 21:01:05 |
Jak pobrać tylko czas dnia – godziny, minuty, sekundy.
Wystarczy odwołać się do parametru TimeOfDay. Parametr ten zwraca nam obiekt TimeSpan, zawierający godzinę, minutę, sekundę oraz milisekundy.
|
TimeSpan godzina = DateTime.UtcNow.ToLocalTime().TimeOfDay; Console.WriteLine(godzina); //Otrzymamy: 21:07:03.1153899 //W Polsce jest obecnie 21:07:03 |
Formatowanie godziny dla własnych potrzeb.
Załóżmy, że chcemy, aby nasza godzina nie zawierała sekund oraz milisekund.
|
TimeSpan godzina = DateTime.UtcNow.ToLocalTime().TimeOfDay; //użyłem interpolacji $"" - nie będę tego tłumaczył Console.WriteLine($"{godzina.Hours}:{godzina.Minutes}"); //Otrzymamy: 21:15 |
Formatowanie daty na własne potrzeby.
Załóżmy, że chcemy z dziejszej daty tylko dzien oraz miesiąc. W tym celu posłużymy się metodą ToString(), a wewnatrz jej podamy interesujący nas format. Poniżej lista możliwych parametrów.
Przykładowe opcje:
- dd – dzien z zerem z przodu, jeżeli jest to liczba od 1-9
- d – dzień bez zera z przodu, jeżeli jest to liczba od 1-9
- ddd – dzień – skrót po angielsku, pierwsze trzy litery
- M – z dużej, ponieważ mała litera “m” zarezerowana jest dla minut
- MM – analogicznie jak dla dni, z zerem lub bez.
- MMM – analogicznie jak dzień, skrót po angielsku, trzy pierwsze litery
- y – analogicznie, jeżeli rok jest mniejszy niż 10 to wyświetli bez zera z przodu
- yy – dwie ostatnie cyfry roku dla roku 2018 będzie to 18
- yyyy – pełny rok
- h – godzina bez zera z przodu, jeżeli jest to liczba od 0-9
- hh – godzina z zerem z przodu, jeżeli jest to liczba od 0-9
- H oraz HH działają analogicznie jak wyżej, natomiast zamieniają nam godzinę z 12 godzinowego zegara na 24 godzinny. Przykład: Jeżeli korzystamy z DateTime.Now zwróci nam godzinę z 12 – (czyli 0-12), godzinowego zegara, aby wyświetlić godzinę z 24 – (czyli 0-24) użyjemy właśnie dużych liczb “H”. Godzina np. 9:45 zostanie zamieniona na 21:45.
- m – minuta bez zera z przodu, jeżeli jest to liczba od 0-9
- mm – minuta z zerem z przodu, jeżeli jest to liczba od 0-9
- s – sekunda bez zera z przodu, jeżeli jest to liczba od 0-9
- ss – sekunda z zerem z przodu, jeżeli jest to liczba od 0-9
- f – milisekundy
- fffffff, maksymalna możliwa dokładność to 7 miejsc
Anegdotka, co będzie za 8 tysięcy lat? Będzie tak: yyyyy. Już teraz można podać taki format, dopisywane jest obecnie zero przed rokiem. Np. 02018
|
DateTime data = DateTime.UtcNow.ToLocalTime(); Console.WriteLine(data.ToString("dd-MM")); //Otrzymamy: 22-02 Console.WriteLine(data.ToString("d-MMM-yy hh:mm")); //Otrzymamy: 22-Feb-18 11:10 Console.WriteLine(data.ToString("dd-MM-yyyy hh:mm:ss")); //Otrzymamy: 22-02-2018 11:10:41 |
Dodawanie czasu do daty.
W tym celu służą wbudowane funkcje. Biblioteka DateTime umożliwia nam dodawanie każdego okresu czasowego – dni, miesiące ,lata, godziny itd.
|
DateTime data = DateTime.UtcNow.ToLocalTime(); Console.WriteLine("Obecna data: "+data); //Obecna data: 22-Feb-18 22:03:29 Console.WriteLine($"Dodawanie 5 dni: {data.AddDays(5)}"); //Dodawanie 5 dni: 27-Feb-18 22:03:29 Console.WriteLine($"Dodawanie 5 miesięcy: {data.AddMonths(5)}"); //Dodawanie 5 miesiecy: 22-Jul-18 22:03:29 Console.WriteLine($"Dodawanie 5 lat: {data.AddYears(5)}"); //Dodawanie 5 lat: 22-Feb-23 22:03:29 Console.WriteLine($"Dodawanie 5 godzin: {data.AddHours(5)}"); //Dodawanie 5 godzin: 23-Feb-18 03:03:29 Console.WriteLine($"Dodawanie 5 minut: {data.AddMinutes(5)}"); //Dodawanie 5 minut: 22-Feb-18 22:08:29 |
Dodawanie czasu do określonej godziny.
Aby dodać czas do określonej godziny możemy użyć na klasie TimeSpan metody Add, a jako parametr podan wartość typu TimeSpan, która ma zostać dodana.
|
TimeSpan godzinaTeraz = DateTime.UtcNow.ToLocalTime().TimeOfDay; Console.WriteLine("Obecny czas: "+ godzinaTeraz); Console.WriteLine($"Dodawanie 5 dni, 5 godzin, 5 minut, 5 sekund, 5 milisekund: {godzinaTeraz.Add(new TimeSpan(5,5,5,5,5))}"); //Otrzymujemy: //Obecny czas: 22:32:38.9162127 //Dodawanie 5 dni, 5 godzin, 5 minut, 5 sekund, 5 milisekund: 6.03:37:43.9212127 |
Odejmowanie i porównywanie
Aby odjąć datę od daty posługujemy się oparatorem matematycznym odejmowania.
|
DateTime data1 = DateTime.UtcNow; DateTime data2 = DateTime.UtcNow.AddDays(2); Console.WriteLine(data2-data1); //Otrzymamy: 2.00:00:00 |
Z odejmowaniem godzin jest taka sama sytuacja
|
TimeSpan czas1 = DateTime.UtcNow.ToLocalTime().TimeOfDay; TimeSpan czas2 = DateTime.UtcNow.ToLocalTime().TimeOfDay; Console.WriteLine(czas2 - czas1); //Otrzymamy: 00:00:00.0960915 |
Aby porównywać daty też możemy użyć operatorów matematycznych.
|
DateTime data1 = DateTime.UtcNow; DateTime data2 = DateTime.UtcNow.AddDays(2); if(data2>=data1) Console.WriteLine("Data2 jest młodsza."); //Otrzymamy: Data2 jest młodsza. |
A teraz przykładowy kod, w aplikacji konsolowej.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
using System; namespace Time_wiedza { class Program { static void Main(string[] args) { //Przykładowe dane wejściowe //Czynne od var odGodziny = "10"; var odMinuty = "00"; //Czynne do var doGodziny = "20"; var doMinuty = "00"; //Lączymy dane wejsciowe w godzine i minute we wlasciwym formacie var Od = $"{odGodziny}:{odMinuty}"; var Do = $"{doGodziny}:{doMinuty}"; //Obliczamy jak dlugo jest czynne w ciagu dnia var ileCzynne = DateTime.Parse(Do) - DateTime.Parse(Od); //Pobieramy godzinę, która jest obecnie na zegarze. TimeSpan godzinaTeraz = DateTime.UtcNow.ToLocalTime().TimeOfDay; //Zmienna przechowujaca wiadomosc o aktywności var text = string.Empty; //Sprawdzamy czy obecnie jest czynne if (TimeSpan.Parse(Od)<godzinaTeraz && TimeSpan.Parse(Do) > godzinaTeraz ) { text = $"Jest godzina - {godzinaTeraz.Hours}:{godzinaTeraz.Minutes}. Teraz jest czynne. Zapraszamy do zakupów."; } else { text = $"Jest godzina - {godzinaTeraz.Hours}:{godzinaTeraz.Minutes}. Teraz jest nieczynne. Zapraszamy od: {Od}"; } //Formatujemy ileCzynne na ladny napis var ileCzynnePretty = $"{ileCzynne.Hours} godzin i {ileCzynne.Minutes} minut."; //Wyświetlamy nasze dane. Console.WriteLine($"Czynne od: {Od}, czynne do: {Do}.\nCzynne: {ileCzynnePretty}.\nObecnie: {text}"); Console.ReadKey(); } } } |
Pasjonat informatyki, bloger.
Full-stack Developer
Technologie:
- ASP.NET MVC
- ASP.NET CORE
- Angular 2+