VB中有现成的控件! 
使用 DateTimePicker 控件
DateTimePicker 控件显示日期和/或时间信息,并且可以作为一个用户用以修改日期和时间信息的界面。控件的显示包含由控件格式字符串定义的字段。当下拉 DateTimePicker 控件时,将会显示一个 MonthView 日历。该控件有两种不同的模式: 下拉日历模式(缺省)——使用户能够显示下拉的日历,以便用于选择日期。
时间格式模式——使用户能够在日期显示中选择一个字段(即月、日、年等),并通过按下控件右部的上/下箭头来设置其值。 
可以使用控件将日期按照各种预先设置的格式显示,这些格式包括短日期(11/14/97)、长日期(Friday, November 14, 1997)和时间(7:00:00 PM)。也可以使用格式字符串来指定自定义格式,或使用回调字段创建自己的格式。下拉日历模式的DateTimePicker 控件时间格式模式的DateTimePicker 控件可能的用途
在需要显示使用受限制的或特殊格式字段的日期信息时,例如在某些工资表和进度应用程序中。
使用户能够通过单击鼠标就可以选择日期而不用输入日期值。 
使用控件的两种模式
DateTimePicker 对输入日期和时间的值来说就象一个被屏蔽的编辑控件。日期或时间的各个部分在控件的编辑部分中是被作为独立的字段对待的。当用户单击每个字段时,字段将被突出显示,并且可以通过上下箭头来增减相应字段的值。用户也可以在必要的地方直接在控件中输入值。UpDown 属性决定了控件属于何种模式。当 UpDown 被设为 False时,控件就属于下拉日历模式(缺省值)。如果 UpDown 属性被设为 True,那么DateTimePicker 就属于时间格式模式。在时间格式模式中,控件的右部将出现两个滚动箭头。用户可以通过用鼠标单击这些箭头来增减当前选中字段的值。在下拉日历模式中,该控件下拉出一个用户可以选择日期的日历。下拉日历有 MonthView 控件的大多数特性。有关如何建立和格式化 DateTimePicker 控件的下拉日历部分的详细信息,请参阅“使用 MonthView 控件”。设置和返回日期
在控件中当前选中的日期是由 Value 属性决定的。可以在显示控件前(例如,在设计时或在Form_Load事件中)设置控件的 Value 属性,以便决定在控件中一开始选中哪个日期:DTPicker1.Value = "10/31/97"缺省情况下,控件的 Value 被设置为当前日期。如果在代码中更改了 DateTimePicker 的 Value 属性,控件会自动更新并反映出新的设置。Value 属性返回一个原始的日期值,或者空值。DateTimePicker 控件具有几个属性,可以返回有关显示日期的特定信息: Month 属性返回包含当前选定日期的月份整数值(1-12)。
Day 属性返回当前选定的日(1-31)。
DayOfWeek 属性返回一个值,指出所选日期是星期几。(值根据 vbDayOfWeek 常量定义的值决定)
Year 属性返回包含当前选定日期的年份整数值。
Week 属性返回包含当前选定日期的星期序号。 
使用 Change 事件来确定用户何时更改了控件中的日期值。使用CheckBox来选择无日期
使用 CheckBox 属性能够指定控件是否返回日期。缺省情况下,CheckBox 的值为 False,并且控件总是返回一个日期。要让用户能够指定无日期,可以将 CheckBox 属性设置为 True(例如,如果使用 DateTimePicker 控件输入工程的完成日期而该工程还没有完成)。如果 CheckBox 属性设为True,那么在控件日期和时间左边的编辑部分中将出现一个小的复选框。如果这个复选框没有被选中,那么 Value 属性返回一个空值。如果选中了这个复选框,那么控件通过 Value 属性返回当前显示日期。使用日期和时间的格式
DateTimePicker 提供了很强的灵活性,以便在控件中将日期和时间的显示格式化。可以使用所有标准的 Visual Basic 格式化字符串,也可以使用回调字段来创建自定义格式。Format 属性决定了控件如何格式化原始日期值。可以从预定义的格式化选项中选择一个,或使用控件的自定义格式化功能。CustomFormat 属性定义了用于显示控件内容的格式表达式。可以通过指定格式字符串来告诉控件如何将日期输出格式化。DateTimePicker 控件支持下面这些格式字符串:字符串描述d1或2位的日。dd2位日,1位值前加0。ddd3字符星期缩写。dddd星期全名。h12小时格式1或2位小时。hh12小时格式2位小时,1位值前加0。H24小时格式1或2位小时。HH24小时格式2位小时,1位值前加0。m1或2位分钟。mm2位分钟,1位值前加0。M1或2位月份。MM2位月份,1位值前加0。MMM3字符月份缩写。MMMM月份全名。s1或2位的秒。ss2位的秒,1位值前加0。t1字母 AM/PM 缩写(“AM”简写为“A”)。tt2字母 AM/PM 缩写(“AM”简写为“AM”)。X回调字段,使程序员可以控制显示字段(如下所示。)可以使用一系列多个‘X’来表示唯一的回调字段。y1位年份(即1996显示为“6”)。yy年份的最后2位(即1996显示为“96”)。yyy完整的年份(即1996显示为“1996”)。可以在格式字符串中添加主体文本。例如,如果希望控件按照“Today is: 05:30:31 Friday Nov 14, 1997”格式显示当前日期,那么格式字符串应为“'Today is: 'hh':'m':'s ddddMMMdd', 'yyy”。主体文本必须用单引号括起来。利用回调字段创建自定义格式
上面描述的自定义格式之一就是回调字段。回调字段允许用户对格式字符串某个部分的输出进行自定义。要声明回调字段,必须在格式字符串主体中包含一个或多个‘X’字符(ASCII 码为88)。回调字段按照从左到右的顺序显示。当用包含一个或多个回调字段的格式显示新的日期时,对于每个回调字段都会引发 Format 和 FormatSize 事件。可以使用 Format 事件来指定一个自定义响应字符串,同时可以通过 FormatSize 事件决定用于显示该字符串的空间。通过这种行为可以对回调字段的显示实现完全的控制。每个‘X’序列都具有不同的含义。例如,X 可能表示“st/nd/rd/th”(即“1st一”“2nd”“3rd”“4th”等),而“XX”则可能表示“第一”“第二”“第三”“第四”等。这些字段并不对用户的文本进行格式化,而是把日期转化为可显示的格式。例如,如果想要用英语显示月份的同时用西班牙语显示,应使用类似于下面的格式:July (Julio) 29需要创建的格式字符串如下所示:MMMM XXXX d在处理Format 和 FormatSize 事件时,可以通过将输入格式字符串和“XXXX”进行比较来检查调用了哪个回调字段。如果字段字符串匹配,那么将生成输出字符串“(Julio)”,同时可以得到输出字符串的长度。X的个数仅被应用程序用来确定为回调字段提供什么样的文字。在处理FormatSize 事件时,文本的大小可以在程序中通过计算得到。Format 事件在控件需要填充回调字段时被调用,例如,当用户从下拉日历中选择了不同的日期时。但是 FormatSize 事件仅在格式字符串发生变化时被调用(例如,将格式从“XX”变为“XXXX”时。)这意味着在 FormatSize 事件中计算回调字段大小时,必须考虑 Format 事件返回的任何可能的结果。 例如,可以应用下面的过程来实现上面提到的格式字符串中的回调字段。 
在窗体的(General)(Declarations)部分,声明一个数组变量作为查找表来保存西班牙文的月份名称: 
Private sSpMonth(12) As String在窗体的 Load 事件中,充填查找表,并将 DTPicker 设置为使用自定义格式字符串: 
sSpMonth(0) = "Enero"
sSpMonth(1) = "Febrero"
sSpMonth(2) = "Marzo"
sSpMonth(3) = "Abril"
sSpMonth(4) = "Mayo"
sSpMonth(5) = "Junio"
sSpMonth(6) = "Julio"
sSpMonth(7) = "Agusto"
sSpMonth(8) = "Septiembre"
sSpMonth(9) = "Octubre"
sSpMonth(10) = "Noviembre"
sSpMonth(11) = "Diciembre"DTPicker1.Format = dtpCustom
DTPicker1.CustomFormat = "MMMM (XXX) dd, yy"在 FormatSize 事件中,从可能的返回值列表中找到最长的值。将这个值的长度指定为格式字符串的长度。这样将会避免在更改控件值时剪 短西班牙文的月份名称。 
Private Sub DTPicker1_FormatSize(ByVal CallbackField As String,
Size As Integer)
Dim iMaxMonthLen As Integer
Dim iC As Integer
Select Case CallbackField
Case "XXX"
iMaxMonthLen = 0
For iC = 0 To 11
If iMaxMonthLen < Len(sSpMonth(iC)) Then
iMaxMonthLen = Len(sSpMonth(iC))
End If
Next iC
End Select
Size = iMaxMonthLen
End Sub在 Format 事件中,返回适当的值作为格式化字符串: 
Private Sub DTPicker1_Format(ByVal CallbackField As String,
FormattedString As String)
Select Case CallbackField
Case "XXX"
FormattedString = sSpMonth(DTPicker1.Month - 1)
End Select
End Sub可以通过重复“X”字符创建唯一的回调字段。这样,格式字符串“XX dddd MMM dd', 'yyy XXX”就包含了两个回调字段。可以使用 Select 或 If 语句在 Format 和 FormatSize 事件中处理多个回调字符串。回调字段被视为有效的字段处理,因此应用程序必须准备好处理CallbackKeyDown 事件。可以使用该事件处理回调字段中的单个击键,同时提供击键合法性检查或自动完成输入。例如,如果用户在输入月份时输入了字母“D”,可以使用 CallbackKeyDown 事件用“十二月”填充回调字段。格式化 Calendar 控件
有多种选择可以对控件的下拉日历部分进行格式化。所有以“日历”打头的DateTimePicker 的属性都能影响下拉日历的格式。这些属性分别对应于 MonthView 控件中的属性。例如,DateTimePicker 的 CalendarTitleTextColor 属性和 MonthView 的 TitleTextColor 属性对应。有关日历格式化问题的详细信息,请参阅“使用 MonthView 控件”主题。键盘界面
可以通过键盘对Calendar 控件进行操作。下表描述了在运行时可以对控件进行的各种

解决方案 »

  1.   

    MSDN:
     
     
    Year 函数
          返回 Variant (Integer),包含表示年份的整数。语法Year(date)必要的 date 参数,可以是任何能够表示日期的 Variant、数值表达式、字符串表达式或它们的组合。如果 date 包含 Null,则返回 Null。
     
    ====================================================================
     
    Month 函数
          返回一个 Variant (Integer),其值为 1 到 12 之间的整数,表示一年中的某月。语法Month(date)必要的 date 参数,可以是任何能够表示日期的 Variant、数值表达式、字符串表达式或它们的组合。如果 date 包含 Null,则返回 Null。
    ====================================================================
    MonthName函数
          描述返回一个表示指定月份的字符串。语法MonthName(month[, abbreviate])MonthName函数语法有如下几部分:部分 描述 
    month 必需的。月份的数值表示。例如一月是1,二月是2,等等。 
    abbreviate 可选的。Boolean值,表示月份名是否缩写。如果忽略,缺省值为False,表明月份名不能被缩写。 ====================================================================
    Day 函数
          返回一个 Variant (Integer),其值为 1 到 31 之间的整数,表示一个月中的某一日。语法Day(date)必要的 date 参数,可以是任何能够表示日期的 Variant、数值表达式、字符串表达式或它们的组合。如果 date 包含 Null,则返回 Null。
    ====================================================================
     
    Weekday 函数
          返回一个 Variant (Integer),包含一个整数,代表某个日期是星期几。语法Weekday(date, [firstdayofweek])Weekday 函数语法有下列的命名参数:部分 描述 
    date 必要。能够表示日期的 Variant、数值表达式、字符串表达式或它们的组合。如果 date 包含 Null,则返回 Null。 
    Firstdayofweek 可选。指定一星期第一天的常数。如果未予指定,则以 vbSunday 为缺省值。 
    设置firstdayofweek 参数有以下设定值:常数 值 描述 
    vbUseSystem 0 使用 NLS API 设置。 
    VbSunday 1 星期日(缺省值) 
    vbMonday 2 星期一 
    vbTuesday 3 星期二 
    vbWednesday 4 星期三 
    vbThursday 5 星期四 
    vbFriday 6 星期五 
    vbSaturday 7 星期六 
    返回值Weekday 函数可以返回以下诸值:常数 值 描述 
    vbSunday 1 星期日 
    vbMonday 2 星期一 
    vbTuesday 3 星期二 
    vbWednesday 4 星期三 
    vbThursday 5 星期四 
    vbFriday 6 星期五 
    vbSaturday 7 星期六 ====================================================================
    WeekdayName函数
          描述返回一个字符串,表示一星期中的某天。语法WeekdayName(weekday, abbreviate, firstdayofweek)WeekdayName函数语法有如下几部分:部分 描述 
    weekday 必需的。数字值,表示一星期中的某天。该数字值要依赖于firstdayofweek设置中的设置值来决定。 
    abbreviate 可选的。Boolean值,表示星期的名称是否被缩写。如果忽略该值,缺省值为False,表明星期的名称不能被缩写。 
    firstdayofweek 可选的。数字值,表示一星期中第一天。关于其值,请参阅“设置值”部分。 
    设置值firstdayofweek参数值如下:常数 值 描述 
    vbUseSystem 0 使用本国语言支持 (NLS) API设置值。 
    vbSunday 1 星期日(缺省)。 
    vbMonday 2 星期一 
    vbTuesday 3 星期二 
    vbWednesday 4 星期三 
    vbThursday 5 星期四 
    vbFriday 6 星期五 
    vbSaturday 7 星期六 ====================================================================
     
    Hour 函数
          返回一个 Variant (Integer),其值为 0 到 23 之间的整数,表示一天之中的某一钟点。语法Hour(time)必要的 time 参数,可以是任何能够表示时刻的 Variant、数值表达式、字符串表达式或它们的组合。如果 time 包含 Null,则返回 Null。
    ====================================================================
     
    Minute 函数
          返回一个 Variant (Integer),其值为 0 到 59 之间的整数,表示一小时中的某分钟。语法Minute(time)必要的 time 参数,可以是任何能够表示时刻的 Variant、数值表达式、字符串表达式或它们的组合。如果 time 包含 Null,则返回 Null。
    ====================================================================
     
    Second 函数
          返回一个 Variant (Integer),其值为 0 到 59 之间的整数,表示一分钟之中的某个秒。语法Second(time)必要的 time 参数,可以是任何能够表示时刻的 Variant、数值表达式、字符串表达式或它们的组合。如果 time 包含 Null,则返回 Null。
      

  2.   

    ====================================================================
    DateAdd 函数
          返回包含一个日期的 Variant (Date),这一日期还加上了一段时间间隔。语法DateAdd(interval, number, date)DateAdd 函数语法中有下列命名参数:部分 描述 
    interval 必要。字符串表达式,是所要加上去的时间间隔。 
    number 必要。数值表达式,是要加上的时间间隔的数目。其数值可以为正数(得到未来的日期),也可以为负数(得到过去的日期)。 
    date 必要。Variant (Date) 或表示日期的文字,这一日期还加上了时间间隔。 
    设置interval 参数具有以下设定值:设置 描述 
    yyyy 年 
    q 季 
    m 月 
    y 一年的日数 
    d 日 
    w 一周的日数 
    ww 周 
    h 时 
    n 分钟 
    s 秒 
    说明可以使用 DateAdd 函数对日期加上或减去指定的时间间隔。例如,可以用 DateAdd 来计算距今天为三十天的日期;或者计算距现在为 45 分钟的时间。为了对 date 加上“日”,可以使用“一年的日数” (“y”),“日” (”d”) 或“一周的日数” (”w”)。DateAdd 函数将不返回有效日期。在以下实例中将 1 月31 日加上一个月:DateAdd(m, 1, 31-Jan-95)上例中,DateAdd 返回 1995 年 2 月 28 日,而不是 1995 年 2 月 31 日。如果 date 是 1996 年 1 月 31 日,则由于 1996 年是闰年,返回值是 1996 年 2 月 29 日。如果计算的日期超前 100 年(减去的年度超过 date 中的年份),就会导致错误发生。如果 number 不是一个 Long 值,则在计算时取最接近的整数值来计算。注意   DateAdd 返回值的格式由 Control Panel设置决定,而不是由传递到date 参数的格式决定。
    ====================================================================
     
    DateDiff 函数
          返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目。语法DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])DateDiff 函数语法中有下列命名参数:部分 描述 
    interval 必要。字符串表达式,表示用来计算date1 和 date2 的时间差的时间间隔 
    Date1□date2 必要;Variant (Date)。计算中要用到的两个日期。 
    Firstdayofweek 可选。指定一个星期的第一天的常数。如果未予指定,则以星期日为第一天。 
    firstweekofyear 可选。指定一年的第一周的常数。如果未予指定,则以包含 1 月 1 日的星期为第一周。 
    设置interval 参数的设定值如下:设置 描述 
    yyyy 年 
    q 季 
    m 月 
    y 一年的日数 
    d 日 
    w 一周的日数 
    ww 周 
    h 时 
    n 分钟 
    s 秒 
    firstdayofweek 参数的设定值如下:常数 值 描述 
    vbUseSystem 0 使用 NLS API 设置。 
    vbSunday 1 星期日(缺省值) 
    vbMonday 2 星期一 
    vbTuesday 3 星期二 
    vbWednesday 4 星期三 
    vbThursday 5 星期四 
    vbFriday 6 星期五 
    vbSaturday 7 星期六 常数 值 描述 
    vbUseSystem 0 用 NLS API 设置。 
    vbFirstJan1 1 从包含 1 月 1 日的星期开始(缺省值)。 
    vbFirstFourDays 2 从第一个其大半个星期在新的一年的一周开始。 
    vbFirstFullWeek 3 从第一个无跨年度的星期开始。 
    说明DateDiff 函数可用来决定两个日期之间所指定的时间间隔数目。例如,可以使用 DateDiff 来计算两个日期之间相隔几日,或计算从今天起到年底还有多少个星期。为了计算 date1 与 date2 相差的日数,可以使用“一年的日数”(y) 或“日”(d)。当 interval 是“一周的日数”(w) 时,DateDiff 返回两日期间的周数。如果 date1 是星期一,DateDiff 计算到 date2 为止的星期一的个数。这个数包含 date2 但不包含 date1。不过,如果 interval 是“周”(ww),则 DateDiff 函数返回两日期间的“日历周”数。由计算 date1 与 date2 之间星期日的个数而得。如果 date2 刚好是星期日,则 date2 也会被加进 DateDiff 的计数结果中;但不论 date1 是否为星期日,都不将它算进去。如果 date1 比 date2 来得晚,则 DateDiff 函数的返回值为负数。firstdayofweek 参数会影响使用时间间隔符号 “W” 或 “WW” 计算的结果。如果 date1 或 date2 是日期文字,则指定的年份成为该日期的固定部分。但是,如果 date1 或 date2 用双引号 (" ") 括起来,且年份略而不提,则在每次计算表达式 date1 或 date2 时,当前年份都会插入到代码之中。这样就可以书写适用于不同年份的程序代码。在计算 12 月 31 日和来年的 1 月 1 日的年份差时,DateDiff 返回 1 表示相差一个年份,虽然实际上只相差一天而已。
    ====================================================================
     
    DatePart 函数
          返回一个包含已知日期的指定时间部分的 Variant (Integer)。语法DatePart(interval, date[,firstdayofweek[, firstweekofyear]])DatePart 函数语法中有下列命名参数:部分 描述 
    interval 必要。字符串表达式,是要返回的时间间隔。 
    date 必要。要计算的 Variant (Date) 值。 
    Firstdayofweek 可选。指定一个星期的第一天的常数。如果未予指定,则以星期日为第一天。 
    firstweekofyear 可选。指定一年第一周的常数。如果未予指定,则以包含 1 月 1 日的星期为第一周。 
    设置interval 参数的设定值如下:设置 描述 
    yyyy 年 
    q 季 
    m 月 
    y 一年的日数 
    d 日 
    w 一周的日数 
    ww 周 
    h 时 
    n 分钟 
    s 秒 
    firstdayofweek 参数的设定值如下:常数 值 描述 
    vbUseSystem 0 使用 NLS API 设置。 
    vbSunday 1 星期日(缺省值) 
    vbMonday 2 星期一 
    vbTuesday 3 星期二 
    vbWednesday 4 星期三 
    vbThursday 5 星期四 
    vbFriday 6 星期五 
    vbSaturday 7 星期六 
    firstweekofyear 参数的设定值如下:常数 值 描述 
    vbUseSystem 0 使用 NLS API 设置。 
    vbFirstJan1 1 从包含 1 月 1 日的星期开始(缺省值)。 
    vbFirstFourDays 2 从第一个其大半个星期在新的一年的一周开始。 
    vbFirstFullWeek 3 从第一个无跨年度的星期开始。 
    说明DatePart 函数可以用来计算日期并返回指定的时间间隔。例如,可以使用DatePart 计算某个日期是星期几或目前为几点钟。firstdayofweek 参数会影响使用时间间隔符号 “W” 或 “WW” 计算的结果。如果 date 是日期文字,则指定的年份成为该日期的固定部分。但是,如果 date 用双引号 (" ") 括起来,且年份略而不提,则在每次计算 date 表达式时,当前年份都会插入到代码之中。这样就可以书写适用于不同年份的程序代码。
    ====================================================================
     
    DateSerial 函数
          返回包含指定的年、月、日的 Variant (Date)。语法DateSerial(year, month, day)DateSerial 函数语法有下列的命名参数:部分 描述 
    year 必要;Integer。从 100 到 9999 间的整数,或一数值表达式。 
    month 必要;Integer。任何数值表达式。 
    day 必要;Integer。任何数值表达式。 
    说明为了指定某个日期,如 1991 年 12 月 31 日,DateSerial 函数中的每个参数的取值范围应该是可接受的;即,日的取值范围应在 1-31 之间,而月的取值范围应在 1-12 之间。但是,当一个数值表达式表示某日之前或其后的年、月、日数时,也可以为每个使用这个数值表达式的参数指定相对日期。以下示例中使用了数值表达式代替绝对日期。这里,DateSerial 函数返回 1990 年 8 月 1 日的 十 年 (1990 - 10) 零两个月 (8 - 2) 又一天 (1 - 1) 之前的日期;换句话说,就是 1980 年 5 月 31 日。DateSerial(1990 - 10, 8 - 2, 1 - 1)year 参数的数值若介于 0 与 29 之间,则将其解释为 2000–2029年,若介于 30 和 99 之间则解释为1930–1999年。而对所有其它 year 参数,则请用四位数值表示(如 1800)。当任何一个参数的取值超出可接受的范围时,它会适时进位到下一个较大的时间单位。例如,如果指定了 35 天,则这个天数被解释成一个月加上多出来的日数,多出来的日数将由其年份与月份来决定。如果一个参数值超出 -32,768 到 32,767 的范围,就会导致错误发生。
    ====================================================================
     
    DateValue 函数
          返回一个 Variant (Date)。语法DateValue(date)必要的 date 参数 date 通常是字符串表达式,表示从 100 年 1 月 1 日到 9999  年 12 月 31 日之间的一个日期。但是,date 也可以是任何表达式,其所代表的日期、时间在上述范围内。说明如果 date 是一个字符串,且其内容只有数字以及分隔数字的日期分隔符,则 DateValue 就会根据系统中指定的短日期格式来识别月、日、年的顺序。DateValue 也识别明确的英文月份名称,全名或缩写均可。例如,除了 12/30/1991 和 12/30/91 之外,DateValue 也识别 December 30, 1991 和 Dec 30, 1991。如果 date 中略去了年这一部分,DateValue 就会使用由计算机系统日期设置的当前年份。如果 date 参数包含时间信息,则 DateValue 不会返回它。但是,如果 date 包含无效时间信息(如 89:98),则会导致错误发生。
    ====================================================================