【个人机房重构】—— VB.NET中,时间日期数据类型的处理与常见问题

背景:在机房个人版重构中,对于时间日期的处理是一个很棘手的问题。稍微不注意,便会出现各种问题。有时候你虽然知道哪错了,但是却不知怎么改。这就是菜鸟的悲哀吧!


一、时间日期数据类型大揭秘


    下边主要介绍在Visual Basic .Net中日期时间类型数据的处理方法及在处理这些数据时的一些注意事项和技巧。


1. 结构和类的区别


    我们在编程中,通常都需要处理时间日期数据,这也是一种比较难于处理的数据类型,因为时间日期类型的结构相当复杂,并且还有一定的规则,如果在定义的时候不符合规则,程序在编译的时候就会出错。在Visual Basic .Net用以处理时间日期类型的结构(Structure)主要是2个,分别为DateTimeTimeSpan,这二个结构都位于命名空间System,并且在Visual Basic .Net中自己也定义了一种数据类型Date,这种数据类型相当于上面提及的DateTime类。这时候可能很多朋友会问了,什么叫结构,它有什么作用?其实结构和类在作用和功能上是非常类似的,它也有构造函数,二者的主要区别如下:

  
1. 结构不能包含显式的无参数构造函数。结构成员将自动初始化为它们的默认值。
  2. 结构不能有以下形式的初始值设定项:base。


  其实对于大多数朋友,你具体使用结构和类的时候,完全可以不需要考虑到二者区别,因为二者在使用上几乎相同。

2. 用Date变量定义日期时间,及其注意事项


  虽然Visual Basic .Net中提供了Date数据类型来处理时间日期类型,但在实际中往往并不使用它,因为它的定义非常麻烦,加上时间日期类型结构相当复杂,对于很多初学者往往会出现错误。下面就是在Visual Basic .Net中通过Date数据类型定义一个时间日期类型数据变量的语句,就可见其烦杂了:

      Dim s As Date = #12/2/2002 7:00:00 PM#

在定义Date数据类型时候,必须注意下面三点

  1. Date数值必须以数字符号"#"括起来。

  2. Date数值中的日期数据可有可无,如果有必须符合格式"m/d/yyyy"。
  3. Date数值中的时间数据可有可无,如果有必须和日期数据通过空格分开,并且时分秒之间以":"分开。

3. DateTime和TimeSpan的主要区别,和二者主要的成员及其简单说明


㈠、DateTime和TimeSpan的关系和区别:

  DateTime和TimeSpan是Visual Basic .Net中用以处理时间日期类型数据的二个主要的结构,这二者的区别在于,DatTime表示一个固定的时间,而TimeSpan表示的是一个时间间隔,即一段时间。在下面介绍的程序示例中,TimeSpan就用以当前时间和给定时间之差。

㈡、DateTime和TimeSpan中的常用成员及其说明:

  DateTime结构和TimeSpan结构提供了丰富的方法和属性,通过这些方法和属性,几乎可以直接处理任何时间日期类型数据。


表01和表02分别是DateTime结构的常用属性和常用方法及其说明:


表01:datetime类的常用属性及其说明

属性

说明

date

获取此实例的日期部分。

day

获取此实例所表示的日期为该月中的第几天。

dayofweek

获取此实例所表示的日期是星期几。

dayofyear

获取此实例所表示的日期是该年中的第几天。

hour

获取此实例所表示日期的小时部分。

millisecond

获取此实例所表示日期的毫秒部分。

minute

获取此实例所表示日期的分钟部分。

month

获取此实例所表示日期的月份部分。

now

创建一个datetime实例,它是此计算机上的当前本地日期和时间。

second

获取此实例所表示日期的秒部分。

timeofday

获取此实例的当天的时间。

today

获取当前日期。

year

获取此实例所表示日期的年份部分。


表02:datetime结构的常用方法及其说明

方法

说明

add

将指定的timespan的值加到此实例的值上。

adddays

将指定的天数加到此实例的值上。

addhours

将指定的小时数加到此实例的值上。

addmilliseconds

将指定的毫秒数加到此实例的值上。

addminutes

将指定的分钟数加到此实例的值上。

addmonths

将指定的月份数加到此实例的值上。

addseconds

将指定的秒数加到此实例的值上。

addyears

将指定的年份数加到此实例的值上。

daysinmonth

返回指定年份中指定月份的天数。

isleapyear

返回指定的年份是否为闰年的指示。

parse

将日期和时间的指定字符串表示转换成其等效的datetime实例。

subtract

从此实例中减去指定的时间或持续时间。

tolongdatestring

将此实例的值转换为其等效的长日期字符串表示形式。

tolongtimestring

将此实例的值转换为其等效的长时间字符串表示形式。

toshorttimestring

将此实例的值转换为其等效的短时间字符串表示形式。

toshortdatestring

将此实例的值转换为其等效的短日期字符串表示形式。



表03和表04分别是timespan结构的常用属性和常用方法及其说明:


表03:timespan结构的常用属性及其说明

属性

说明

days

获取由此实例表示的整天数。

hours

获取由此实例表示的整小时数。

milliseconds

获取由此实例表示的整毫秒数。

minutes

获取由此实例表示的整分钟数。

seconds

获取由此实例表示的整秒数。

ticks

获取用刻度表示的此实例的值。

totaldays

获取以整天数和天的小数部分表示的此实例的值。

totalhours

获取以整小时数和小时的小数部分表示的此实例的值。

totalmilliseconds

获取以整毫秒数和毫秒的小数部分表示的此实例的值。

totalminutes

获取以整分钟数和分钟的小数部分表示的此实例的值。

totalseconds

获取以整秒数和秒的小数部分表示的此实例的值。


表04:timespan结构的常用方法及其说明

方法

说明

add

将指定的timespan添加到此实例中。

duration

返回其值为此实例的绝对值的timespan。

fromdays

返回表示指定天数的timespan,其中对天数的指定精确到最接近的毫秒。

fromhours

返回表示指定小时数的timespan,其中对小时数的指定精确到最接近的毫秒。

frommilliseconds

返回表示指定毫秒数的timespan。

fromminutes

返回表示指定分钟数的timespan,其中对分钟数的指定精确到最接近的毫秒。

fromseconds

返回表示指定秒数的timespan,其中对秒数的指定精确到最接近的毫秒。

subtract

从此实例中减去指定的timespan。


4. 判断给定时间日期的合法性、日期时间类型数据(DateTime实例)的运算与日期时间及其相关数值的获取


  在了解了DateTime和TimeSpan的常用方法和常用属性后,下面将通过一个示例来掌握上述方法和属性的用法。在下面的示例中将着重介绍下列问题的处理方法:

  1. 判断输入的日期时间字符串的合法性。
  2. DateTime实例之间的运算。
  3. 日期时间数据的获取方法。


下面是用Visual Basic .Net实现上述功能的示例的主要步骤:

   1. 启动 Visual Studio .Net。
  2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。

   3. 将【项目类型】设置为【Visual Basic项目】。
  4. 将【模板】设置为【Windows窗体应用程序】。
  5. 在【名称】文本框中输入【处理日期时间数据】。
  6. 在【位置】的文本框中输入【E:\VS.NET项目】,然后单击【确定】按钮,这样在"E:\VS.NET项目"目录中就产生了名称为"处理日期时间数据"的文件夹,并在里面创建了名称为【处理日期时间数据】的项目文件。
  7. 把Visual Studio .Net的当前窗口切换到【Form1.vb(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件,并执行相应操作:

  
一个TabControl组件(包含三个TabPage组件.)
  十九个Label组件。
  十九个TextBox组件,用以显示时间日期数值。
  三个Button组件,并在这三个Button组件拖入Form1的设计窗体后,分别双击这三个组件,这样系统会在Form1.vb文件分别产生这三个组件的Click时间对应的处理代码。


  8. 按照图01、图02、图03设定设定组件的主要属性

  图01:【处理日期时间数据】设计界面之一



图02:【处理日期时间数据】设计界面之二


图03:【处理日期时间数据】设计界面之三



    在完成上面的工作以后,下面就进入程序的功能实现阶段。

    9判断输入的日期时间字符串的合法性

    为了实现这个功能,首先要掌握把输入的日期时间字符串转换成可供Visual Basic .Net使用的日期时间类型的数据的方法。这个方法就是使用DateTime中的Parse方法,Parse方法能够把一个符合日期时间的字符串转换成一个DateTime实例。下面是一个具体的转换代码:


Dim dtTemp as System.DateTime = System.DateTime.Parse ( "12/2/2002 13:20:25")


但如果给定要转换的字符串不合法,程序在执行的时候就会出现异常。程序通过对异常的捕获,来判断给定要转换的字符串合法性。在Visual Basic .Net中捕获异常一般使用的是Try …Catch ….End Try语句。这里要注意的是Try …Catch ….End Try语句是一个非常重要的语句,在后面章节中的很多关键代码部分都会经常的使用到它,通过它的确能够解决很多麻烦的问题。


下面是在本程序中实现这个功能的具体操作步骤:

  首先把Visual Studio .Net的当前窗口切换到【Form1.vb】,进入Form1.vb文件的编辑界面。然后用下列的代码替换Form1.vb中btnJudge组件的Click事件对应的处理代码。


'判断输入日期时间字符串合法性  
Private Sub btnJudge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnJudge.Click
    Dim dtMyDate As System.DateTime

    Try
        dtMyDate = DateTime.Parse(txtDateTime.Text) '转换给定的日期时间字符串  

    Catch

        MessageBox.Show("你输入的时间日期字符串不合法!", "错误!")  '提示错误  
        txtDateTime.Text = ""
        Return

    End Try
End Sub
'获取计算机日期时间数据
'程序要实现这个功能非常简单,只需要掌握表01和表02中列出的DateTime常用属性、方法的使用方法就能够方便完成了。具体到本程序具体的操作是用下列代码替换Form1.vb中btnDateTimeNow的Click事件对应的处理代码

'获得计算机日期、时间  
Private Sub btnDateTimeNow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDateTimeNow.Click
    '创建实例,此实例存放当前日期和时间  
    Dim dMyDate As DateTime = DateTime.Now

    '显示当前日期和时间  
    txtDateTimeNow.Text = dMyDate.ToString()

    '显示当前日期  
    txtDateNow.Text = dMyDate.Date

    '显示当前年度  
    txtYear.Text = dMyDate.Year

    '显示当前月份  
    txtMonth.Text = dMyDate.Month

    '显示日号  
    txtDay.Text = dMyDate.Day

    '显示当前天是一年中的第多少天  
    txtDayofyear.Text = dMyDate.DayOfYear

    '显示当前天是本星期中的第多少天  
    txtWeek.Text = dMyDate.DayOfWeek

    '以长日期形式来显示日期  
    txtDateLong.Text = dMyDate.ToLongDateString

    '以短日期形式来显示日期  
    txtDateShort.Text = dMyDate.ToShortDateString

    '显示当前时间  
    txtTimeNow.Text = dMyDate.TimeOfDay.ToString()

    '显示当前时间的小时  
    txtHour.Text = dMyDate.Hour

    '显示当前时间的分钟  
    txtMinute.Text = dMyDate.Minute

    '显示当前时间的秒  
    txtSecond.Text = dMyDate.Second

    '显示当前时间的毫秒  
    txtMillisecond.Text = dMyDate.Millisecond

    '以长时间形式来显示当前时间  
    txtTimeLong.Text = dMyDate.ToLongTimeString

    '以短时间形式来显示当前时间  
    txtTimeShort.Text = dMyDate.ToShortTimeString
End Sub

'日期时间数据的运算
'在下面介绍的代码是实现二个DateTime实例之差,即当前的时间和给定的时间之差。解决的步骤是首先判断给定的日期时间字符串的合法性,如果不合法,则返回。如果合法,则以此来创建DateTime实例dtMyDate。然后dtMyDate调用其Subtract方法减去当前的时间,并存放到TimeSpan实例tsTemp。tsTemp调用其Duration方法,把二者之差的绝对值显示出来。具体到程序中的实现方法是用下列代码替换Form1.vb中的btnOK的Click事件的处理代码:

'输入时间与系统时间之差  
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
    Dim tsTemp As TimeSpan
    Dim dtMydate As DateTime
    '判断输入的时间日期字符串的合法性  
    Try
        dtMydate = DateTime.Parse(txtDateTimeEnter.Text)
    Catch
        MessageBox.Show("输入的时间日期字符串不合法", "错误!")
        Return

    End Try

    '两个DateTime实例相减  
    tsTemp = dtMydate.Subtract(DateTime.Now)

    '取两个各DateTime之差绝对值,并显示出来  
    txtTimeDifference.Text = tsTemp.Duration.ToString()
End Sub


至此在上述步骤都正确执行,并成功保存后,【处理日期时间数据】项目的全部工作就完成了。图04、图05和图06分别是【处理日期时间数据】项目编译后的运行界面:


图04:



图05:



图06:





二、常见的时间日期类型问题



1.常见错误:


   (1)错误类型一:SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/999911:59:59 PM之间。

       A 原因我们在取DateTime.MinValue的值,并插入到数据库的时候,DateTime.MinValue值范围和数据库DateTime类型数据范围不一致造成的。数据库中,DateTime类型字段,最小值1/1/175312:00:00,而.NET Framework中,DateTime类型,最小值为1/1/00010:00:00,显然,超出了Sql的值的最小范围,导致数据溢出的错误。

       B 解决方案转换时间类型格式。如:

[vb]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:18px;"Dim currentDate As Date = Now()  
  2.   enWork.LogingDate =Convert.ToDateTime(Format(currentDate, "yyyy/MM/dd"))  
  3.   enWork.LoginTime =Convert.ToDateTime(Format(currentDate, "HH:mm:ss"))</span>  


     (2)错误类型二:插入数据库中的时间都是00:00:00

        A 原因:使用到存储过程,存储过程中时间类型是varchar,而vb.net实体类中的时间类型是Datetime,类型不匹配,未能插入成功。

        B 解决方案将存储过程中的时间类型改为time(7)

 

   (3)错误类型三:从类型“TimeSpan”到类型“Date”的转换无效。

       A 原因从数据库中获取的时间是timeSpan类型的,需要转换成字符串类型的方可赋值给实体

        B 解决方案

[vb]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="white-space:pre">      </span><span style="font-size:18px;">enOnLine.OnTime =Convert.ToString(dtQuery.Rows(0).Item("onTime"))</span>  

  

2.常见方法


     (1)方法一:计算时间差--使用DateDiff函数:返回一个Long值,用于指定两个Date值之间的时间间隔数

    例如:       

[vb]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="white-space:pre">  </span><span style="font-size:18px;">Dim Time1 As Date  
  2.         Dim Time2 As Date  
  3.         Dim Diff As String  
  4.         Diff = DateDiff(DateInterval.Minute,Time1, Time2)</span>  

       其中:DateInterval.Minute:设置时间间隔格式为分钟。(用户可根据自己具体要求设定)


    (2)方法二:时间取整--使用Format函数:返回已按照格式String表达式中包含的指令进行了格式化了的字符串

[vb]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:18px;">Dim Int as String  
  2. Int=Format(Diff, "0.0")<span style="font-family: 微软雅黑;"> </span></span>  

       其中:这里用到的不是四舍五入,而是通过对字符串进行按照既定要求格式化得到的。


   (3)方法三:取出时间中的小时值

[vb]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="white-space:pre">  </span><span style="font-size:18px;">Dim Time asDate  
  2. <span style="white-space:pre">  </span>Dim Hour asInteger  


三、反思


    自己刚开始做机房的时候,对数据类型的理解特别的肤浅。有些根本不知道是什么类型的,干什么用的。对日期类型的数据更是感觉特别麻烦,每次使用都得考虑半天。后来,上网查了查资料,对日期类型的总算是有点明白了。

    很多时候,不是我们没有能力去做好一件事,而是我们没有用心,不想去做。用心,我们可以战胜任何challenge!



附:VB.NET时间日期数据处理及技巧(实例)代码下载地址:http://download.csdn.net/detail/mazhaojuan/4033970


转载自:http://blog.csdn.net/mazhaojuan/article/details/7216880

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值