2024年7月26日 星期五

22.VB.NET 筆記 基礎篇 - 時間 (DateTime)

VB.NET 時間 (DateTime) 筆記 (基礎篇)

VB.NET 時間 (DateTime) 筆記 (基礎篇)

時間就像指引前進方向的指南針。在程式設計中,靈活運用 DateTime,才能創建出符合現實需求的應用程式。VB.NET 提供了強大的 DateTime 結構來處理日期和時間,透過瞭解其特性和使用方法,可以輕鬆處理各種時間相關的任務。

認識 DateTime

DateTime: DateTime 是 VB.NET 中用於表示日期和時間的結構。它可以精確到毫秒,並提供了各種屬性和方法來操作和格式化日期時間。DateTime 結構是不可變的,每次對其進行操作都會返回一個新的 DateTime 實例。

DateTime 具有以下重要特性:

  • 精確度DateTime 就像一個精密的時鐘,可以精確到毫秒。同樣地,DateTime 結構可以精確表示日期和時間,適用於需要高精度時間的場景。: DateTime 可以精確表示從公元 1 年 1 月 1 日午夜 12:00:00 到公元 9999 年 12 月 31 日 23:59:59.9999999 之間的日期和時間。
  • 時區感知DateTime 就像一個全球通用的時鐘,可以根據不同時區顯示正確的時間。同樣地,DateTime 結構可以與 TimeZoneInfo 類一起使用,以處理不同時區的日期和時間。: DateTime 本身不包含時區資訊,但可以與 TimeZoneInfo 類一起使用,以處理特定時區的日期和時間。
  • 可格式化DateTime 就像一個萬能的時間格式轉換器,可以將日期時間轉換為各種格式的字串。同樣地,DateTime 結構提供了多種格式化選項,可以根據不同的需求輸出日期時間字串。: DateTime 提供了各種格式化選項,可以將日期和時間轉換為特定格式的字串。
  • 可進行算術運算DateTime 就像一個時間計算器,可以方便地進行日期時間的加減運算。同樣地,DateTime 結構支持各種算術運算,如加減天數、月份或年份,以及計算兩個日期之間的時間間隔。: DateTime 支持算術運算,如加減天數、月份或年份。可以使用 TimeSpan 結構來表示兩個 DateTime 之間的時間間隔。

創建和使用 DateTime

功能一:創建 DateTime 實例 (基本建立方法)

在 VB.NET 中,可以使用多種方式來創建 DateTime 實例。最常見的方法包括使用構造函數、取得當前時間,以及從字串解析。

使用的控制項:
  • Label1: 用於顯示使用構造函數創建的日期。
  • Label2: 用於顯示使用構造函數創建的日期時間。
  • Label3: 用於顯示當前日期和時間。
  • Label4: 用於顯示當前日期(時間部分為 00:00:00)。
  • Label5: 用於顯示從字串解析的日期。
範例程式碼
' 定義主要的表單類別
Public Class Form1
    ' 表單載入時的初始化
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 使用構造函數創建一個表示 2023 年 7 月 26 日的 DateTime
        Dim dt1 As New DateTime(2023, 7, 26)
        ' 設定 Label1 顯示創建的日期
        Label1.Text = "構造函數(日期): " & dt1.ToString("yyyy/MM/dd")
        
        ' 使用構造函數創建一個表示 2023 年 7 月 26 日 14:30:00 的 DateTime
        Dim dt2 As New DateTime(2023, 7, 26, 14, 30, 0)
        ' 設定 Label2 顯示創建的日期時間
        Label2.Text = "構造函數(日期時間): " & dt2.ToString("yyyy/MM/dd HH:mm:ss")
        
        ' 取得當前的日期和時間
        Dim currentTime As DateTime = DateTime.Now
        ' 設定 Label3 顯示當前時間
        Label3.Text = "當前時間: " & currentTime.ToString("yyyy/MM/dd HH:mm:ss")
        
        ' 取得當前的日期(時間部分為 00:00:00)
        Dim today As DateTime = DateTime.Today
        ' 設定 Label4 顯示當前日期
        Label4.Text = "今天日期: " & today.ToString("yyyy/MM/dd")
        
        ' 從字串 "2023/07/26" 解析出 DateTime
        Dim dtFromString As DateTime = DateTime.Parse("2023/07/26")
        ' 設定 Label5 顯示解析的日期
        Label5.Text = "從字串解析: " & dtFromString.ToString("yyyy/MM/dd")
    End Sub
End Class
詳細講解

此範例展示了創建 DateTime 實例的五種常見方法。首先,使用 New DateTime(年, 月, 日) 構造函數創建只包含日期的 DateTime 實例。其次,使用 New DateTime(年, 月, 日, 時, 分, 秒) 創建包含完整日期時間的實例。

第三種方法使用 DateTime.Now 屬性取得當前的日期和時間,這在需要記錄操作時間時非常有用。第四種方法使用 DateTime.Today 取得當前日期,時間部分會自動設為午夜 00:00:00。最後,使用 DateTime.Parse 方法從字串解析出 DateTime,這個方法可以自動識別常見的日期格式。

功能二:訪問 DateTime 的各個部分 (屬性使用)

DateTime 提供了豐富的屬性來訪問日期時間的各個組成部分,如年、月、日、時、分、秒等。這些屬性讓我們可以靈活地提取和使用日期時間的不同部分。

使用的控制項:
  • Label1 到 Label8: 用於顯示 DateTime 的各個部分。
範例程式碼
' 定義主要的表單類別
Public Class Form1
    ' 表單載入時的初始化
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 創建一個表示 2023 年 7 月 26 日 14:30:00 的 DateTime
        Dim dt As New DateTime(2023, 7, 26, 14, 30, 0)
        
        ' 訪問 DateTime 的年部分
        Label1.Text = "年: " & dt.Year
        
        ' 訪問 DateTime 的月部分
        Label2.Text = "月: " & dt.Month
        
        ' 訪問 DateTime 的日部分
        Label3.Text = "日: " & dt.Day
        
        ' 訪問 DateTime 的時部分
        Label4.Text = "時: " & dt.Hour
        
        ' 訪問 DateTime 的分部分
        Label5.Text = "分: " & dt.Minute
        
        ' 訪問 DateTime 的秒部分
        Label6.Text = "秒: " & dt.Second
        
        ' 取得 DateTime 的星期幾
        Label7.Text = "星期幾: " & dt.DayOfWeek.ToString()
        
        ' 格式化 DateTime 為完整字串
        Label8.Text = "完整時間: " & dt.ToString("yyyy/MM/dd HH:mm:ss")
    End Sub
End Class
詳細講解

此範例展示了如何訪問 DateTime 的各個組成部分。YearMonthDay 屬性分別返回年、月、日的數值。HourMinuteSecond 屬性返回時、分、秒的數值。

DayOfWeek 屬性返回一個列舉值,表示該日期是星期幾(Sunday、Monday 等)。這些屬性都是唯讀的,因為 DateTime 是不可變的結構。如果需要修改日期時間,必須創建一個新的 DateTime 實例。

DateTime 的格式化

功能三:格式化 DateTime 為字串 (ToString 方法)

DateTime 提供了豐富的格式化選項,可以將日期和時間轉換為各種格式的字串。透過 ToString 方法和格式字串,可以自訂輸出的格式。

使用的控制項:
  • Label1 到 Label7: 用於顯示不同格式的日期時間字串。
範例程式碼
' 定義主要的表單類別
Public Class Form1
    ' 表單載入時的初始化
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 創建一個表示 2023 年 7 月 26 日 14:30:00 的 DateTime
        Dim dt As New DateTime(2023, 7, 26, 14, 30, 0)
        
        ' 格式化為 yyyy/MM/dd 格式
        Label1.Text = "yyyy/MM/dd: " & dt.ToString("yyyy/MM/dd")
        
        ' 格式化為 MM-dd-yyyy 格式
        Label2.Text = "MM-dd-yyyy: " & dt.ToString("MM-dd-yyyy")
        
        ' 格式化為中文日期格式
        Label3.Text = "中文格式: " & dt.ToString("yyyy年MM月dd日")
        
        ' 格式化為完整日期時間格式
        Label4.Text = "完整格式: " & dt.ToString("dd/MM/yyyy HH:mm:ss")
        
        ' 格式化為包含毫秒的格式
        Label5.Text = "含毫秒: " & dt.ToString("yyyy/MM/dd HH:mm:ss.fff")
        
        ' 格式化為包含星期幾縮寫的格式
        Label6.Text = "含星期縮寫: " & dt.ToString("yyyy/MM/dd ddd")
        
        ' 格式化為包含完整星期幾的格式
        Label7.Text = "含完整星期: " & dt.ToString("dddd, yyyy/MM/dd")
    End Sub
End Class
詳細講解

此範例展示了 DateTime 格式化的多種應用。yyyy 表示四位數年份,MM 表示兩位數月份,dd 表示兩位數日期。HH 表示 24 小時制的小時,mm 表示分鐘,ss 表示秒。

fff 表示毫秒的三位數表示。ddd 顯示星期幾的三字母縮寫(如 Wed),而 dddd 顯示完整的星期幾名稱(如 Wednesday)。這些格式字串可以自由組合,並加入自訂的分隔符號(如斜線、破折號或中文字),以符合不同的顯示需求。

DateTime 的算術運算

功能四:DateTime 的加減運算 (Add 方法)

DateTime 支持各種算術運算,可以方便地對日期時間進行加減操作。透過 AddDays、AddMonths、AddYears 等方法,可以輕鬆計算未來或過去的日期。

使用的控制項:
  • Label1 到 Label7: 用於顯示各種時間運算的結果。
範例程式碼
' 定義主要的表單類別
Public Class Form1
    ' 表單載入時的初始化
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 創建一個表示 2023 年 7 月 26 日 14:30:00 的 DateTime
        Dim dt As New DateTime(2023, 7, 26, 14, 30, 0)
        
        ' 顯示原始日期
        Label1.Text = "原始日期: " & dt.ToString("yyyy/MM/dd HH:mm:ss")
        
        ' 加 7 天
        Dim dtAfter7Days As DateTime = dt.AddDays(7)
        ' 顯示 7 天後的日期
        Label2.Text = "7天後: " & dtAfter7Days.ToString("yyyy/MM/dd")
        
        ' 減 3 天
        Dim dtBefore3Days As DateTime = dt.AddDays(-3)
        ' 顯示 3 天前的日期
        Label3.Text = "3天前: " & dtBefore3Days.ToString("yyyy/MM/dd")
        
        ' 加 2 個月
        Dim dtAfter2Months As DateTime = dt.AddMonths(2)
        ' 顯示 2 個月後的日期
        Label4.Text = "2個月後: " & dtAfter2Months.ToString("yyyy/MM/dd")
        
        ' 加 5 年
        Dim dtAfter5Years As DateTime = dt.AddYears(5)
        ' 顯示 5 年後的日期
        Label5.Text = "5年後: " & dtAfter5Years.ToString("yyyy/MM/dd")
        
        ' 加 2 小時
        Dim dtAfter2Hours As DateTime = dt.AddHours(2)
        ' 顯示 2 小時後的時間
        Label6.Text = "2小時後: " & dtAfter2Hours.ToString("HH:mm:ss")
        
        ' 減 30 分鐘
        Dim dtBefore30Minutes As DateTime = dt.AddMinutes(-30)
        ' 顯示 30 分鐘前的時間
        Label7.Text = "30分鐘前: " & dtBefore30Minutes.ToString("HH:mm:ss")
    End Sub
End Class
詳細講解

此範例展示了 DateTime 的加減運算。AddDays 方法接受一個整數參數,正數表示加上天數,負數表示減去天數。同樣地,AddMonthsAddYears 用於加減月份和年份。

AddHoursAddMinutesAddSeconds 方法用於加減時間部分。需要注意的是,這些方法都會返回一個新的 DateTime 實例,而不會修改原始的 DateTime 物件,因為 DateTime 是不可變的結構。這種設計確保了執行緒安全執行緒安全是指程式碼能在多執行緒環境下正確執行,不會產生資料競爭或不一致的結果。

DateTime 的比較

功能五:比較 DateTime 的大小 (比較運算)

在 VB.NET 中,可以使用多種方式來比較 DateTime 的大小。包括使用比較運算符、CompareTo 方法和 Equals 方法。

使用的控制項:
  • Label1 到 Label7: 用於顯示各種比較運算的結果。
範例程式碼
' 定義主要的表單類別
Public Class Form1
    ' 表單載入時的初始化
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 創建第一個 DateTime 表示 2023 年 7 月 26 日
        Dim dt1 As New DateTime(2023, 7, 26)
        ' 創建第二個 DateTime 表示 2023 年 7 月 27 日
        Dim dt2 As New DateTime(2023, 7, 27)
        ' 創建第三個 DateTime 也表示 2023 年 7 月 26 日
        Dim dt3 As New DateTime(2023, 7, 26)
        
        ' 使用小於運算符比較 dt1 和 dt2
        Label1.Text = "dt1 < dt2: " & (dt1 < dt2).ToString()
        
        ' 使用大於運算符比較 dt1 和 dt2
        Label2.Text = "dt1 > dt2: " & (dt1 > dt2).ToString()
        
        ' 使用等於運算符比較 dt1 和 dt3
        Label3.Text = "dt1 = dt3: " & (dt1 = dt3).ToString()
        
        ' 使用不等於運算符比較 dt1 和 dt2
        Label4.Text = "dt1 不等於 dt2: " & (dt1 <> dt2).ToString()
        
        ' 使用 CompareTo 方法比較 dt1 和 dt2 (返回 -1)
        Label5.Text = "dt1.CompareTo(dt2): " & dt1.CompareTo(dt2).ToString()
        
        ' 使用 CompareTo 方法比較 dt2 和 dt1 (返回 1)
        Label6.Text = "dt2.CompareTo(dt1): " & dt2.CompareTo(dt1).ToString()
        
        ' 使用 Equals 方法比較 dt1 和 dt3 (返回 True)
        Label7.Text = "dt1.Equals(dt3): " & dt1.Equals(dt3).ToString()
    End Sub
End Class
詳細講解

此範例展示了比較 DateTime 的三種方法。首先,可以直接使用比較運算符(小於、大於、等於、不等於)來比較兩個 DateTime 的大小,這是最直觀的方法。

CompareTo 方法返回一個整數值:如果調用者小於參數則返回 -1,相等則返回 0,大於則返回 1。Equals 方法返回布林值,只有當兩個 DateTime 完全相同時才返回 True。比較時會考慮到毫秒級的差異,因此即使看起來相同的日期,如果時間部分不同也會被判斷為不相等。

DateTime 的解析與轉換

功能六:從字串解析 DateTime (Parse 方法)

在實際應用中,經常需要從字串(如使用者輸入或檔案內容)解析出 DateTime。VB.NET 提供了 Parse、ParseExact 和 TryParse 等方法來處理這類需求。

使用的控制項:
  • TextBox1: 用於輸入日期字串。
  • Button1: 用於觸發解析操作。
  • Label1 到 Label4: 用於顯示解析結果。
範例程式碼
' 定義主要的表單類別
Public Class Form1
    ' 表單載入時的初始化
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 設定 TextBox1 的預設值
        TextBox1.Text = "2023/07/26"
        ' 設定 Label1 的初始文字
        Label1.Text = "請輸入日期並按下按鈕"
    End Sub
    
    ' 按下 Button1 時觸發的事件
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' 取得 TextBox1 中的文字
        Dim dateString As String = TextBox1.Text
        ' 宣告一個 DateTime 變數用於存放解析結果
        Dim dt As DateTime
        
        ' 使用 TryParse 嘗試解析字串
        If DateTime.TryParse(dateString, dt) Then
            ' 解析成功,顯示解析的日期
            Label1.Text = "解析成功: " & dt.ToString("yyyy/MM/dd")
            
            ' 顯示該日期是星期幾
            Label2.Text = "星期: " & dt.DayOfWeek.ToString()
            
            ' 計算距離今天的天數
            Dim daysDiff As TimeSpan = dt - DateTime.Today
            ' 顯示距離今天的天數
            Label3.Text = "距今天: " & daysDiff.Days.ToString() & " 天"
            
            ' 格式化為不同格式顯示
            Label4.Text = "格式化: " & dt.ToString("yyyy年MM月dd日")
        Else
            ' 解析失敗,顯示錯誤訊息
            Label1.Text = "解析失敗,請輸入正確的日期格式"
            ' 清空其他標籤
            Label2.Text = ""
            Label3.Text = ""
            Label4.Text = ""
        End If
    End Sub
End Class
詳細講解

此範例展示了如何安全地解析使用者輸入的日期字串。TryParse 方法是推薦的做法,因為它不會在解析失敗時拋出異常,而是返回一個布林值表示是否成功,並透過輸出參數返回解析結果。

如果解析成功,程式會顯示解析的日期、該日期是星期幾,以及距離今天的天數。計算天數差使用了 TimeSpan 結構,它表示兩個 DateTime 之間的時間間隔。如果解析失敗,程式會顯示友善的錯誤訊息,而不會導致程式崩潰。這種做法提高了程式的健壯性健壯性是指程式能夠正確處理異常情況和錯誤輸入,不會輕易崩潰。