本课学习目标
- 认识 DateTime 类型。
- 使用 DateTime.Now 与 DateTime.Today。
- 取得 Year、Month、Day、Hour、Minute、Second。
- 使用 AddDays、AddMonths、AddYears。
- 通过两个 DateTime 相减得到 TimeSpan。
- 使用 Windows Forms 的 DateTimePicker。
- 使用标准与自定义日期时间格式。
- 使用 N2、C2、P0 等数字格式。
- 理解“数据本身”和“显示格式”是两回事。
- 完成日期时间与格式化工具箱。
12.1 DateTime 是什么?
DateTime 是 .NET 用来表示日期和时间的重要类型。它可以同时保存年、月、日、时、分、秒等信息。
Dim currentTime As DateTime = DateTime.Now
Dim today As DateTime = DateTime.Today
DateTime.Now当前日期与时间
例如:2026-08-11 22:43:15。
DateTime.Today今天的日期
时间部分通常为当天 00:00:00。
New DateTime(...)建立指定日期
可以明确指定年、月、日。
例如建立一个固定日期:
Dim courseDate As New DateTime(2026, 9, 15)
这里依次表示:
12.2 DateTime.Now 与 DateTime.Today
Dim nowValue As DateTime = DateTime.Now
Dim todayValue As DateTime = DateTime.Today
lblResult.Text =
"现在:" & nowValue.ToString() & Environment.NewLine &
"今天:" & todayValue.ToString()
12.3 取得年、月、日与时间部分
DateTime 提供很多属性,可以分别取得日期和时间组成部分:
Dim nowValue As DateTime = DateTime.Now
Dim yearValue As Integer = nowValue.Year
Dim monthValue As Integer = nowValue.Month
Dim dayValue As Integer = nowValue.Day
Dim hourValue As Integer = nowValue.Hour
Dim minuteValue As Integer = nowValue.Minute
Dim secondValue As Integer = nowValue.Second
| 属性 | 作用 | 示例 |
|---|---|---|
| Year | 年份 | 2026 |
| Month | 月份 | 8 |
| Day | 日 | 11 |
| Hour | 小时(24 小时制) | 22 |
| Minute | 分钟 | 43 |
| Second | 秒 | 15 |
| DayOfWeek | 星期 | Tuesday |
12.4 日期加减
DateTime 提供非常方便的日期运算方法:
Dim today As DateTime = DateTime.Today
Dim tomorrow As DateTime = today.AddDays(1)
Dim nextWeek As DateTime = today.AddDays(7)
Dim nextMonth As DateTime = today.AddMonths(1)
Dim nextYear As DateTime = today.AddYears(1)
today.AddDays(7)增加或减少天数;负数表示往前。
today.AddMonths(1)增加月份,并正确处理不同月份天数。
today.AddYears(1)增加年份。
DateTime.Now.AddHours(2)增加小时,适合时间计算。
例如计算 30 天后的日期:
Dim dueDate As DateTime = DateTime.Today.AddDays(30)
12.5 TimeSpan:两个时间之间的差
两个 DateTime 相减,会得到一个 TimeSpan:
Dim startDate As New DateTime(2026, 8, 1)
Dim endDate As New DateTime(2026, 8, 11)
Dim difference As TimeSpan = endDate - startDate
lblResult.Text = "相差天数:" & difference.TotalDays.ToString()
这里结果是 10 天。
| TimeSpan 成员 | 意义 |
|---|---|
| Days | 天数部分。 |
| Hours | 小时部分。 |
| Minutes | 分钟部分。 |
| TotalDays | 整个时间差换算成总天数。 |
| TotalHours | 整个时间差换算成总小时。 |
12.6 DateTimePicker 控件
Windows Forms 提供 DateTimePicker,让用户通过日期选择器输入日期,比要求用户手动输入日期文字更可靠。
从 Toolbox 拖入 DateTimePicker 后,可以通过:
Dim selectedDate As DateTime = dtpDate.Value
取得用户选择的日期。
常见设置:
| 属性 | 作用 |
|---|---|
| Value | 当前选择的 DateTime。 |
| Format | 选择 Long、Short、Time 或 Custom 显示方式。 |
| CustomFormat | 在 Format = Custom 时使用自定义格式。 |
| MinDate | 允许选择的最早日期。 |
| MaxDate | 允许选择的最晚日期。 |
12.7 标准日期与时间格式
和 Lesson 10、11 一样,可以调用 ToString(),但这次传入日期时间格式代码。
Dim nowValue As DateTime = DateTime.Now
Dim shortDate As String = nowValue.ToString("d")
Dim longDate As String = nowValue.ToString("D")
Dim shortTime As String = nowValue.ToString("t")
Dim longTime As String = nowValue.ToString("T")
Dim general As String = nowValue.ToString("g")
| 格式 | 用途 | 典型显示 |
|---|---|---|
| d | 短日期 | 11/8/2026 |
| D | 长日期 | Tuesday, 11 August 2026 或系统语言对应格式 |
| t | 短时间 | 10:43 PM 或 22:43 |
| T | 长时间 | 10:43:15 PM 或 22:43:15 |
| g | 一般日期 + 短时间 | 11/8/2026 10:43 PM |
12.8 自定义日期时间格式
如果希望固定显示结构,可以使用自定义格式:
Dim nowValue As DateTime = DateTime.Now
lblResult.Text = nowValue.ToString("yyyy-MM-dd HH:mm:ss")
| 格式符 | 意义 | 示例 |
|---|---|---|
| yyyy | 四位年份 | 2026 |
| MM | 两位月份 | 08 |
| dd | 两位日期 | 11 |
| HH | 24 小时制小时 | 22 |
| hh | 12 小时制小时 | 10 |
| mm | 分钟 | 43 |
| ss | 秒 | 15 |
| tt | AM / PM 标记 | PM |
12.9 数字格式化
格式化并不会改变原数值,只改变它转换成 String 时的显示方式。
Dim value As Double = 12345.6789
Dim n0 As String = value.ToString("N0")
Dim n2 As String = value.ToString("N2")
Dim n3 As String = value.ToString("N3")
12,346千位分隔,不显示小数。
12,345.68千位分隔,显示两位小数。
12345.68固定两位小数,通常不使用千位分隔。
12345.679自定义三位小数。
12.10 金额与百分比格式
金额
Dim amount As Decimal = 1250.5D
Dim displayAmount As String = amount.ToString("C2")
C2 使用当前系统文化的货币符号,并显示两位小数。
百分比
Dim discountRate As Decimal = 0.15D
Dim p0 As String = discountRate.ToString("P0")
Dim p2 As String = discountRate.ToString("P2")
典型显示:
- P0 → 15%
- P2 → 15.00%
12.11 数据值与显示格式要分开
下面的 amount 仍然是 Decimal:
Dim amount As Decimal = 1250.5D
只有显示时才转换成 String:
lblAmount.Text = amount.ToString("N2")
不要因为界面需要显示两位小数,就过早把数值变成 String。后面还要继续计算时,应尽量保留原来的数值类型。
amount As Decimal 可以继续加、减、乘、除。
amount.ToString("N2") 是给用户看的文字。
12.12 实作:日期时间与格式化工具箱
建立新的 Windows Forms 项目:
DateTimeFormatter2026
程序让用户选择一个日期,显示标准与自定义格式,并计算该日期与今天相差多少天;同时让用户输入金额与折扣率,练习数字格式。
自定义日期:2026-09-15
距离今天:35 天
金额:1,250.50
折扣:15%
在 Form1 加入:
| 控件 | Name | Text / 设置 |
|---|---|---|
| Form | Form1 | Text = 日期时间与格式化工具箱 |
| DateTimePicker | dtpSelectedDate | Format = Short |
| TextBox | txtAmount | 输入金额 |
| TextBox | txtRate | 输入比例,例如 0.15 |
| Button | btnShowDate | Text = 显示日期格式 |
| Button | btnDifference | Text = 计算相差天数 |
| Button | btnFormatNumber | Text = 格式化数字 |
| Button | btnClear | Text = 清除 |
| TextBox | txtOutput | Multiline = True;ReadOnly = True;ScrollBars = Vertical |
显示日期格式按钮
Private Sub btnShowDate_Click(sender As Object, e As EventArgs) _
Handles btnShowDate.Click
Dim selectedDate As DateTime = dtpSelectedDate.Value
txtOutput.Text =
"短日期:" & selectedDate.ToString("d") & Environment.NewLine &
"长日期:" & selectedDate.ToString("D") & Environment.NewLine &
"自定义:" & selectedDate.ToString("yyyy-MM-dd") & Environment.NewLine &
"年:" & selectedDate.Year.ToString() & Environment.NewLine &
"月:" & selectedDate.Month.ToString() & Environment.NewLine &
"日:" & selectedDate.Day.ToString()
End Sub
计算相差天数
Private Sub btnDifference_Click(sender As Object, e As EventArgs) _
Handles btnDifference.Click
Dim selectedDate As DateTime = dtpSelectedDate.Value.Date
Dim today As DateTime = DateTime.Today
Dim difference As TimeSpan = selectedDate - today
txtOutput.Text =
"今天:" & today.ToString("yyyy-MM-dd") & Environment.NewLine &
"选择日期:" & selectedDate.ToString("yyyy-MM-dd") & Environment.NewLine &
"相差天数:" & difference.TotalDays.ToString("N0")
End Sub
格式化数字按钮
Private Sub btnFormatNumber_Click(sender As Object, e As EventArgs) _
Handles btnFormatNumber.Click
Dim amount As Decimal = CDec(txtAmount.Text)
Dim rate As Decimal = CDec(txtRate.Text)
txtOutput.Text =
"数字 N2:" & amount.ToString("N2") & Environment.NewLine &
"金额 C2:" & amount.ToString("C2") & Environment.NewLine &
"百分比 P0:" & rate.ToString("P0") & Environment.NewLine &
"百分比 P2:" & rate.ToString("P2")
End Sub
清除按钮
Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
dtpSelectedDate.Value = DateTime.Today
txtAmount.Clear()
txtRate.Clear()
txtOutput.Clear()
txtAmount.Focus()
End Sub
12.13 逐步理解实作程序
使用 dtpSelectedDate.Value,不需要把日期当普通文字解析。
d、D、yyyy-MM-dd 都只改变显示结果,不改变原 DateTime。
selectedDate - today 得到 TimeSpan。
金额和比例转换成 Decimal,仍然保留为可计算的数值。
N2、C2、P0、P2 都在显示阶段使用。
12.14 初学者常见错误
MM 与 mm 写反
MM 是月份,mm 是分钟。
把格式化结果继续当数字计算
ToString 后得到的是 String。计算时应继续保留 Decimal、Double 或 DateTime。
直接让用户手动输入复杂日期
桌面应用中可以优先使用 DateTimePicker,减少错误输入。
误以为 C2 固定是某一种货币
C2 使用当前系统文化的货币格式,因此不同地区可能显示不同符号和分隔方式。
12.15 小练习
- 加入“7 天后”按钮,显示 dtpSelectedDate.Value.AddDays(7)。
- 加入“3 个月后”按钮,使用 AddMonths(3)。
- 显示选择日期是星期几,使用 DayOfWeek。
- 用 yyyy年MM月dd日 格式显示日期。
- 加入一个时间 DateTimePicker,并将 Format 设为 Time。
- 测试 N0、N2、F2 的不同显示效果。
- 输入 0.075,分别用 P0、P1、P2 显示。
本课复习
- DateTime.Now 与 DateTime.Today 有什么区别?
- 如何取得 DateTime 的年份和月份?
- AddDays(-7) 表示什么?
- 两个 DateTime 相减会得到什么类型?
- TotalDays 的作用是什么?
- DateTimePicker 的日期值通过哪个属性取得?
- 日期格式中的 MM 与 mm 有什么区别?
- N2、C2 和 P0 分别适合显示什么?
- 为什么应把“数据本身”和“显示格式”分开?