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

日期、时间与格式化

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

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

本课学习目标

  • 认识 DateTime 类型。
  • 使用 DateTime.NowDateTime.Today
  • 取得 Year、Month、Day、Hour、Minute、Second。
  • 使用 AddDaysAddMonthsAddYears
  • 通过两个 DateTime 相减得到 TimeSpan
  • 使用 Windows Forms 的 DateTimePicker
  • 使用标准与自定义日期时间格式。
  • 使用 N2C2P0 等数字格式。
  • 理解“数据本身”和“显示格式”是两回事。
  • 完成日期时间与格式化工具箱。

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
Day11
Hour小时(24 小时制)22
Minute分钟43
Second15
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
ss15
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. 测试 N0N2F2 的不同显示效果。
  7. 输入 0.075,分别用 P0、P1、P2 显示。

本课复习

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