Operacje na datach i godzinach
Witam w kolejnej części mojego poradnika. Dziś omówimy sobie pokrótce dwie struktury, które będziemy wykorzystywać w naszych programach DateTime i TimeSpan. Struktura DateTime przechowuje odniesienie do pojedynczej daty i czasu np (January 16, 2014 10:00:00). TimeSpan przechowuje interwał czasowy np 5 godzin. TimeSpan mierzony jest w jednostkach Tick w milisekundach a DateTime przechowywany jest jako liczba Tick od północy 1 stycznia 0001r. Pierwsza z nich DateTime, która oferuje nam kilka podstawowych właściwości:
- Now (zwracający aktualną datę i godzinę np 2015-09-16 19:04:55)
- UtcNow (zwracający aktualną datę i godzinę czasu uniwersalnego np 2015-09-16 17:04:55)
- Today (zwracający tylko datę 2015-09-16)
- Date
- Day
- DayOf Week
- DayOfYear
- Hour
- Kind
- Milliseconds
- Year
- Month
- Minute
- Second
- Ticks
- Add
- AddDays
- AddYears
- AddHours
- AddMinutes
- AddMonths
- AddMilliseconds
- AddTicks
- Substract
- ToLongDateString
- ToShortDateString
- ToLongTimeString
- ToShortTimestring
- ToLocalTime
- ToUniversalTime
TextBox1.Text = "Nasz aktualny czas to " & Now.DayOfWeek.ToString & " " & Now.ToStringWynikiem powyższej instrukcji będzie "Nasza aktualny czas to Wednesday 2015-09-16 19:38:13"
Chcielibyśmy np, aby zamiast aktualnego czasu TextBox wyświetlał nam czas w innym rejonie świata. Zrobimy to bez problemu korzystając z powyższych funkcji. Załózmy więc, że nasze przesunięcie to + 4 godziny i 25 min względem naszego aktualnego czasu. Kod więc wyglądać powinien następująco:
Dim przesuniecie As Date przesuniecie = Now.AddHours(4) przesuniecie = przesuniecie.AddMinutes(25) TextBox1.Text = "Czas po przesunięciu = " & przesuniecie
Możliwości pozyskiwania informacji z tej struktury jest cały ogrom. Ogranicza nas jedynie wyobraźnia.
Przejdziemy zatem do struktury TimeSpan, która posłuży nam do wykonywania obliczeń na datach w celu pozyskania jakichś danych.
Załóżmy sobie jakiś cel - to podstawa. Chcielibyśmy stworzyć program, który będzie zliczał nam ile czasu upłynęło odkąd zaczęliśmy pracę. Coś na kształt stopera tylko operować będziemy na datach zamiast na liczeniu ticknięć Timera. Na formie ułożymy sobie 3 Textbox'y i jeden przycisk i napiszemy sobie kod:
Public Class Form1 Private godzwejscia As Date ' deklarujemy zmienną godzina wyjscia Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim aktualnagodzina As Date = DateTime.Now ' deklarujemy zmienną aktualna godzina i przypisujemy jej aktualny czas TextBox2.Text = aktualnagodzina.ToString Dim roznica As TimeSpan ' deklarujemy zmienną dla struktury zliczającej TimeSpan roznica = aktualnagodzina - godzwejscia ' obliczanie róznict ticknięć między tymi dwoma datami TextBox3.Text = roznica.Hours & " godzin " & roznica.Minutes & " minut " & roznica.Seconds & " sekund" ' wyświetlenie wyniku w TextBox3 End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click godzwejscia = DateTime.Now ' przypisanie zmiennej godzwyjscia aktualnego czasu TextBox1.Text = godzwejscia.ToString End Sub End Class
TimeSpan posiada właściwości:
- TotalMilliseconds
- TotalSeconds
- TotalMinutes
- TotalHours
- TotalDays
- Ticks
- Milliseconds
- Seconds
- Minutes
- Hours
- Days
Zamiast kodu powyżej można użyć funkcji Substract z naszej struktury TimeSpan, która jeszcze bardziej uprości nasz kod. Dodajmy do naszej formy dodatkowy czwarty TextBox i zróbmy to samo tylko z dodatkową metodą wg poniższego kodu:
Public Class Form1 Private godzwyjscia As Date ' deklarujemy zmienną godzina wyjscia Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'metoda z odejmowaniem dat Dim aktualnagodzina As Date = DateTime.Now ' deklarujemy zmienną aktualna godzina i przypisujemy jej aktualny czas TextBox2.Text = aktualnagodzina.ToString Dim roznica As TimeSpan ' deklarujemy zmienną dla struktury zliczającej TimeSpan roznica = aktualnagodzina - godzwyjscia ' obliczanie róznict ticknięć między tymi dwoma datami TextBox3.Text = roznica.Hours & " godzin " & roznica.Minutes & " minut " & roznica.Seconds & " sekund" ' wyświetlenie wyniku w TextBox3 'metoda odejmowania dat za pomocą Substract Dim elapsedtime As TimeSpan = DateTime.Now.Subtract(godzwyjscia) TextBox4.Text = elapsedtime.Hours.ToString & " godzin " & elapsedtime.Minutes.ToString & " minut " & elapsedtime.Seconds.ToString & " sekund" End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click godzwyjscia = DateTime.Now ' przypisanie zmiennej godzwyjscia aktualnego czasu TextBox1.Text = godzwyjscia.ToString End Sub End Class
Jak widać obie metody działają identycznie, ale druga metoda zajmuje 2 linie kodu a nie 5 jak poprzednio. To, z której skorzystacie w waszym programie zależy tylko od was.
Zmiana języka
Jak pewnie zauważyliście na poczatku, gdy wyświetliliśmy sobie w TextBox'ie aktualny czas i nazwę dnia tygodnia to wyświetliła się ona po angielsku. Można to oczywiście zmienić. Żeby to uczynić musimy skorzystać z przestrzeni nazw System.Globalization, który obejmuje typ DateTimeFormatInfo zawierający nazwy miesięcy i dni naszej struktury DateTime. Wykonujemy to w poniższy sposób:Najpierw importujemy sobie przed nazwą naszej klasy Form1 przestrzeń nazw System.Globalization
Imports System.Globalization
Następnie tworzymy nowy obiekt CultureInfo
Dim Jezyk As New CultureInfo("pl-PL")
Pobieramy interesujący nas obiekt DateTimeFormatInfo
Dim FormatInfo As DateTimeFormatInfo = jezyk.DateTimeFormat
I teraz możemy wyświetlić sobie to co na początku z nazwą tygodnia w naszym ojczystym języku:
TextBox1.Text = "Nasz aktualny czas to " & FormatInfo.GetDayName(Now.DayOfWeek) & " " & Now.ToStringTextBox teraz wyświetli: "Nasz aktualny czas to środa 2015-09-16 21:49:05"
Poniżej cały kod znajdujący się na formie
Imports System.Globalization Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim Jezyk As New CultureInfo("pl-PL") Dim FormatInfo As DateTimeFormatInfo = Jezyk.DateTimeFormat TextBox1.Text = "Nasz aktualny czas to " & FormatInfo.GetDayName(Now.DayOfWeek) & " " & Now.ToString End Sub End Class
Formatowanie Daty
Wspomnieć muszę jeszcze o formatowaniu dat, często mamy potrzebę aby wyświetlić sobie datę w innym formacie niż preferowany przez nasz program.Poniżej przedstawię specyfikatory formatu daty:
Znak | Działanie |
d lub dd | wyświetla dzień miesiąca jako liczbę |
ddd | skrócona nazwa dnia |
dddd | wyświetla pełną nazwę dnia |
f, ff, fff, ffff, fffff, ffffff, fffffff | wyświetla ułamkowe części sekund odpowiednio z 1,2,3,4,5,6,7 miejscami po przecinku |
g lub gg | wyświetla erę (np A.D.) |
h lub hh | wyświetla godzinę w zakresie 1-12 |
H lub HH | wyświetla godzinę w zakresie 0-23 |
m lub mm | wyświetla minuty w zakresie 0-59 |
M lub MM | wyświetla miesiąc jako liczbę pomiędzy 1-12 |
MMM | Wyświetla skróconą nazwę miesiąca |
MMMM | Wyświetla pełną nazwę miesiąca |
s lub ss | wyświetla sekundy 0-59 |
t | wyświetla pierwszy znak oznaczenia AM/PM |
tt | wyświetla pełne oznaczenie AM/PM |
y lub yy | wyświetla rok jako 2 ostatnie cyfry |
yyyy | wyświetla rok czterocyfrowy |
z lub zz | wyświetla przesunięcie bieżącego czasu systemowego do czasu Greenwich w godzinach |
zzz | wyświetla przesunięcie bieżącego czasu systemowego do czasu Greenwich w godzinach i minutach |
: | separator czasu |
/ | separator daty |
' | wyświetla wartość jakiegokolwiek znaku wstawionego pomiędzy dwoma apostrofami |
Za ich pomocą dokładnie dostosowujemy łańcuch do tego co chcemy otrzymać. Spróbujmy zatem przedstawić datę w pełnej okazałości dbając o każdy szczegół. Piszemy kod:
Dim Jezyk As New CultureInfo("pl-PL") Dim Teraz As Date = DateTime.Now Dim Wynik As String = Teraz.ToString("'Jest 'dddd dd MMMM yyyy gg 'godzina 'HH:mm:ss", Jezyk) TextBox1.Text = WynikWynikiem naszego kodu jest łańcuch w naszym języku o treści: "Jest środa 16 września 2015 A.D. godzina 22:46:35"
Kombinacji jest bardzo wiele, każdy sobie zastosuje takie specyfikatory jakie będą mu potrzebne do przedstawienia informacji.
Jest jeszcze jeden rodzaj formatowania używający skróconych specyfikatorów, ale operuje on na wcześniej zdefiniowanym formatowaniu całego ciągu bez możliwości jego dostosowywania, dlatego nie będę go tu opisywał. Jak ktoś będzie chciał to może doczytać sobie o nim na stronach MSDN pod hasłem "Standardowe ciągi formatujące datę i godzinę"
Do "zobaczenia" w następnym dziale !
Utworzono 16.09.2015
Brak komentarzy:
Prześlij komentarz