Historia pytania:
Praca z datami i czasem zawsze była osobnym aspektem programowania w Visual Basic — od starych typów Variant/Date w VB6 do struktur Date/DateTime w VB.NET. Pojawienie się klasy DateTime pozwoliło na bardziej elastyczną obsługę dat, uzyskiwanie wartości systemowych, obliczanie interwałów i poprawne formatowanie dat.
Problem:
Często występują błędy konwersji ciągów tekstowych na DateTime (szczególnie przy różnych lokalizacjach), błędne działanie z strefami czasowymi, niewłaściwe formatowanie do wyświetlania dla użytkownika lub do wysłania na serwer.
Rozwiązanie:
DateTime to struktura, która pozwala przechowywać datę i czas, wykonywać operacje arytmetyczne, porównania, a także konwertować na żądany format. Do parsowania dat w formie tekstowej używa się funkcji Parse, TryParse, a do formatowania — metody ToString z ciągiem formatującym i (opcjonalnie) CultureInfo.
Przykład kodu:
Dim today As DateTime = DateTime.Now Dim birth As DateTime = New DateTime(1990, 1, 1) Dim formatted As String = today.ToString("yyyy-MM-dd HH:mm") Dim parsed As DateTime If DateTime.TryParse("15/06/2024", parsed) Then Console.WriteLine(parsed.ToString()) End If
Kluczowe cechy:
1. Co to jest DateTime.MinValue?
DateTime.MinValue to data 01.01.0001 00:00:00 (a nie, na przykład, 01.01.1970 jak w UNIX). Używaj ostrożnie przy sprawdzaniu "czy wartość jest ustawiona".
2. Czy można przechowywać "całe dni bez czasu" w DateTime?
Nie, typ DateTime zawsze zawiera wartości czasu. W razie potrzeby przechowuj tylko datę, przypisując czas "00:00:00" i używając tylko formatu daty przy wyjściu.
3. Jak poprawnie porównywać daty, ignorując czas?
Aby porównać tylko część daty, pozbądź się czasu:
Dim aDate As DateTime = DateTime.Now.Date Dim bDate As DateTime = someOtherDate.Date If aDate = bDate Then ...
Aplikacja kliencka przyjmuje datę urodzenia użytkownika przez TextBox i bezpośrednio parsuje ją przez DateTime.Parse(textBox.Text). Użytkownicy europejscy i amerykańscy wprowadzają daty w różnych formatach. W rezultacie — niewłaściwe daty urodzenia lub wyjątki.
Zalety:
Wady:
Wprowadzanie daty odbywa się za pomocą DateTimePicker lub funkcji TryParseExact(textBox.Text, "dd.MM.yyyy", CultureInfo.InvariantCulture, ...). Kod przewiduje mechanizmy awaryjne i dokładną walidację.
Zalety:
Wady: