VB Visual Basic 2026 中文教程
第 12 课 · 日期、时间与显示格式

日期、时间与格式化

日期和时间几乎出现在所有实际应用中:出生日期、订单时间、预约日期、到期日、工作天数、倒数计时等。本课将学习 .NET 的 DateTime 与 TimeSpan,并进一步掌握 ToString 格式化,让日期、时间、金额、数字和百分比以更友好的方式显示。

适合:完成第 11 课的初学者建议时间:50–65 分钟实作:DateTimeFormatter2026

本课学习目标

  • 认识 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)

这里依次表示:

2026Year
9Month
15Day
DateTime2026-09-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()
Today 仍然是 DateTime 它不是只有“日期文字”,而是一个 DateTime 值,只是时间部分通常为午夜 00:00:00。

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)
AddDays()today.AddDays(7)

增加或减少天数;负数表示往前。

AddMonths()today.AddMonths(1)

增加月份,并正确处理不同月份天数。

AddYears()today.AddYears(1)

增加年份。

AddHours()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整个时间差换算成总小时。
Days 与 TotalDays 不一样 Days 是 TimeSpan 的“天数部分”,而 TotalDays 是完整时间跨度折算后的总天数。

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
实际显示会受 Windows 区域设置影响 标准格式会根据电脑当前文化和区域设置决定月份名称、日期顺序、12/24 小时制等,因此不同电脑可能显示不同。

12.8 自定义日期时间格式

如果希望固定显示结构,可以使用自定义格式:

Dim nowValue As DateTime = DateTime.Now

lblResult.Text = nowValue.ToString("yyyy-MM-dd HH:mm:ss")
格式符意义示例
yyyy四位年份2026
MM两位月份08
dd两位日期11
HH24 小时制小时22
hh12 小时制小时10
mm分钟43
ss秒15
ttAM / PM 标记PM
MM 与 mm 不一样 MM 表示月份,mm 表示分钟。这是日期格式中非常常见的错误。

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")
N012,346

千位分隔,不显示小数。

N212,345.68

千位分隔,显示两位小数。

F212345.68

固定两位小数,通常不使用千位分隔。

0.00012345.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%
百分比内部通常用比例保存 15% 通常保存为 0.15,再用 P0 显示成 15%。

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

程序让用户选择一个日期,显示标准与自定义格式,并计算该日期与今天相差多少天;同时让用户输入金额与折扣率,练习数字格式。

Date Time Formatter 2026
选择日期:
2026-09-15
金额:
1250.5
折扣率:
0.15
操作:
显示日期格式计算相差天数格式化数字清除
标准日期:15/9/2026
自定义日期:2026-09-15
距离今天:35 天
金额:1,250.50
折扣:15%

在 Form1 加入:

控件NameText / 设置
FormForm1Text = 日期时间与格式化工具箱
DateTimePickerdtpSelectedDateFormat = Short
TextBoxtxtAmount输入金额
TextBoxtxtRate输入比例,例如 0.15
ButtonbtnShowDateText = 显示日期格式
ButtonbtnDifferenceText = 计算相差天数
ButtonbtnFormatNumberText = 格式化数字
ButtonbtnClearText = 清除
TextBoxtxtOutputMultiline = 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
为什么使用 .Date? dtpSelectedDate.Value 可能包含时间部分。使用 .Date 后,只比较日期,避免小时和分钟影响“相差天数”的结果。

格式化数字按钮

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 逐步理解实作程序

1
从 DateTimePicker 取得 DateTime

使用 dtpSelectedDate.Value,不需要把日期当普通文字解析。

2
使用 ToString 控制显示

d、D、yyyy-MM-dd 都只改变显示结果,不改变原 DateTime。

3
日期相减

selectedDate - today 得到 TimeSpan。

4
读取数值

金额和比例转换成 Decimal,仍然保留为可计算的数值。

5
最后才格式化

N2、C2、P0、P2 都在显示阶段使用。

12.14 初学者常见错误

错误 1

MM 与 mm 写反

MM 是月份,mm 是分钟。

错误 2

把格式化结果继续当数字计算

ToString 后得到的是 String。计算时应继续保留 Decimal、Double 或 DateTime。

错误 3

直接让用户手动输入复杂日期

桌面应用中可以优先使用 DateTimePicker,减少错误输入。

错误 4

误以为 C2 固定是某一种货币

C2 使用当前系统文化的货币格式,因此不同地区可能显示不同符号和分隔方式。

输入验证仍未完成 txtAmount 和 txtRate 仍直接使用 CDec。输入非数字时会转换失败。下一课正好会进入“输入验证与 TryParse”,解决这个问题。

12.15 小练习

  1. 加入“7 天后”按钮,显示 dtpSelectedDate.Value.AddDays(7)。
  2. 加入“3 个月后”按钮,使用 AddMonths(3)。
  3. 显示选择日期是星期几,使用 DayOfWeek。
  4. 用 yyyy年MM月dd日 格式显示日期。
  5. 加入一个时间 DateTimePicker,并将 Format 设为 Time。
  6. 测试 N0、N2、F2 的不同显示效果。
  7. 输入 0.075,分别用 P0、P1、P2 显示。

本课复习

  1. DateTime.Now 与 DateTime.Today 有什么区别?
  2. 如何取得 DateTime 的年份和月份?
  3. AddDays(-7) 表示什么?
  4. 两个 DateTime 相减会得到什么类型?
  5. TotalDays 的作用是什么?
  6. DateTimePicker 的日期值通过哪个属性取得?
  7. 日期格式中的 MM 与 mm 有什么区别?
  8. N2、C2 和 P0 分别适合显示什么?
  9. 为什么应把“数据本身”和“显示格式”分开?