VB.NET中,时间日期数据类型的处理与常见问题
来源:互联网 发布:联合国贸发会议数据库 编辑:程序博客网 时间:2024/05/23 01:20
背景:在机房个人版重构中,对于时间日期的处理是一个很棘手的问题。稍微不注意,便会出现各种问题。有时候你虽然知道哪错了,但是却不知怎么改。这就是菜鸟的悲哀吧!
一、时间日期数据类型大揭秘
下边主要介绍在Visual Basic .Net中日期时间类型数据的处理方法及在处理这些数据时的一些注意事项和技巧。
1. 结构和类的区别
1. 结构不能包含显式的无参数构造函数。结构成员将自动初始化为它们的默认值。
2. 结构不能有以下形式的初始值设定项:base。
其实对于大多数朋友,你具体使用结构和类的时候,完全可以不需要考虑到二者区别,因为二者在使用上几乎相同。
2. 用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实例)的运算与日期时间及其相关数值的获取
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实例。下面是一个具体的转换代码:
但如果给定要转换的字符串不合法,程序在执行的时候就会出现异常。程序通过对异常的捕获,来判断给定要转换的字符串合法性。在Visual Basic .Net中捕获异常一般使用的是Try …Catch ….End Try语句。这里要注意的是Try …Catch ….End Try语句是一个非常重要的语句,在后面章节中的很多关键代码部分都会经常的使用到它,通过它的确能够解决很多麻烦的问题。
下面是在本程序中实现这个功能的具体操作步骤:
首先把Visual Studio .Net的当前窗口切换到【Form1.vb】,进入Form1.vb文件的编辑界面。然后用下列的代码替换Form1.vb中btnJudge组件的Click事件对应的处理代码。
至此在上述步骤都正确执行,并成功保存后,【处理日期时间数据】项目的全部工作就完成了。图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 解决方案:转换时间类型格式。如:
- <span style="font-size:18px;"> Dim currentDate As Date = Now()
- enWork.LogingDate =Convert.ToDateTime(Format(currentDate, "yyyy/MM/dd"))
- 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 解决方案:
- <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值之间的时间间隔数
例如:
- <span style="white-space:pre"> </span><span style="font-size:18px;">Dim Time1 As Date
- Dim Time2 As Date
- Dim Diff As String
- Diff = DateDiff(DateInterval.Minute,Time1, Time2)</span>
其中:DateInterval.Minute:设置时间间隔格式为分钟。(用户可根据自己具体要求设定)
(2)方法二:时间取整--使用Format函数:返回已按照格式String表达式中包含的指令进行了格式化了的字符串
- <span style="font-size:18px;">Dim Int as String
- Int=Format(Diff, "0.0")<span style="font-family: 微软雅黑;"> </span></span>
其中:这里用到的不是四舍五入,而是通过对字符串进行按照既定要求格式化得到的。
(3)方法三:取出时间中的小时值
- <span style="white-space:pre"> </span><span style="font-size:18px;">Dim Time asDate
- <span style="white-space:pre"> </span>Dim Hour asInteger
三、反思
附:VB.NET时间日期数据处理及技巧(实例)代码下载地址:http://download.csdn.net/detail/mazhaojuan/4033970
转载自:http://blog.csdn.net/mazhaojuan/article/details/7216880
- VB.NET中,时间日期数据类型的处理与常见问题
- 【个人机房重构】—— VB.NET中,时间日期数据类型的处理与常见问题
- VB.net中时间和日期的格式化
- .NET 中关于日期时间的格式化处理
- c#.NET 中关于日期时间的格式化处理
- c#.NET 中关于日期时间的格式化处理 (转)
- .NET 中关于日期时间的格式化处理
- C#.NET 中关于日期时间的格式化处理 (转)
- Matlab中处理日期与时间的函数详解
- .NET日期时间处理
- VB 时间处理 日期处理函数
- VB.NET中修改系统的时间
- 时间与日期处理
- 日期与时间处理
- 时间与日期处理
- 时间与日期处理
- 时间与日期处理
- 时间与日期处理
- 中英文对照 —— 风景名胜、国家城市(专有名词)
- 《Evaluating SPARQL Queries on Massive RDF Datasets》——笔记
- 【Leetcode】39. Combination Sum和40. Combination Sum II
- sdut 3895/第八届省赛C题 fireworks 杨辉三角 逆元求C(n,m)%mod
- java中单例模式的几种写法
- VB.NET中,时间日期数据类型的处理与常见问题
- 剑指Offer(第二版)面试题11:旋转数组的最小数字
- Cannot create a server using the selected type
- 【struts2】<s:property name="xx"/>取值
- 数据结构的特性
- 一个java源文件中只能有一个public类的原因
- sublime text3 左侧目录树中文字符显示方块乱码
- Ubuntu Qt5 实现打开多张本地图片并显示到窗口功能
- 模式的秘密——代理模式