16 Vb.Net operacje na datach i godzinach

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)
Każda właściwośc dodatkowo posiada jeszcze wiele róznych metod manipulacji jednostkami czasu np Now posiada metody:
  • Date
  • Day
  • DayOf Week
  • DayOfYear
  • Hour
  • Kind
  • Milliseconds
  • Year
  • Month
  • Minute
  • Second
  • Ticks
Dodatkowo posiada jeszcze dedykowane funkcje np:
  • Add
  • AddDays
  • AddYears
  • AddHours
  • AddMinutes
  • AddMonths
  • AddMilliseconds 
  • AddTicks
  • Substract
  • ToLongDateString
  • ToShortDateString
  • ToLongTimeString
  • ToShortTimestring
  • ToLocalTime
  • ToUniversalTime
Możemy zatem wyświetlić sobie w naszym TextBox'ie aktualny czas np tak:
TextBox1.Text = "Nasz aktualny czas to " & Now.DayOfWeek.ToString & " " & Now.ToString
Wynikiem 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
Jedne od drugich różnią się tym, że jedne pokazują wartość Total czyli sumę wszystkich sekund, minut itd, a drugie pokazują sekundy, minuty i godziny jak normalny zegar czyli kasują się przy wartości 60 i rozpoczynają od nowa. Gdybyśmy w naszym kodzie zamiast Second użyli TotalSeconds to po 10 minutach byśmy już mieli 600 sekund na liczniku a przecież nie o to nam chodzi.

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.ToString
TextBox 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 = Wynik
Wynikiem 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