VB.NET中的日期时间转换

http://blog.csdn.net/tyouvivi/article/details/1567731

刚刚学习VB.NET不久,在做几个小例子的时候发现经常要对日期时间和字符串之间进行转换,现整理如下,如有不正确的地方请大家指出。


1.字符型和日期型之间的转换

日期型转换为字符型是最简单的,可以直接转换。

Dim dt As Date = Now
Debug.WriteLine(
" dt.ToLongDateString= + dt.ToLongDateString)
Debug.WriteLine(
dt.ToLongTimeString= dt.ToLongTimeString)
Debug.WriteLine(
dt.ToShortDateString= dt.ToShortDateString)
Debug.WriteLine(
dt.ToShortTimeString= dt.ToShortTimeString)
Debug.WriteLine(
dt.ToFileTime= dt.ToFileTime.ToString)
Debug.WriteLine(
dt.ToFileTimeUtc= dt.ToFileTimeUtc.ToString)
Debug.WriteLine(
dt.ToLocalTime= dt.ToLocalTime.ToString)
Debug.WriteLine(
dt.ToOADate= dt.ToOADate.ToString)
Debug.WriteLine(
dt.ToUniversalTime= dt.ToUniversalTime.ToString)
Debug.WriteLine(
dt.ToString= dt.ToString)
Debug.WriteLine(
dt.ToString(yyyy/MM/ddhh:mm:ss:fff)= dt.ToString( yyyy/MM/ddhh:mm:ss:fff ))

结果如下:
dt.ToLongDateString
2007年4月16日
dt.ToLongTimeString
15 : 10 21
dt.ToShortDateString
2007 / 04 16
dt.ToShortTimeString

dt.ToFileTime
128211774217140929
dt.ToFileTimeUtc

dt.ToLocalTime

dt.ToOADate
39188.6321957639
dt.ToUniversalTime
6
dt.ToString

dt.ToString(yyyy
MM ddhh:mm:ss:fff) 03 714

用dt.ToString("yyyy/MM/dd hh:mm:ss:fff")是最方便的,可以转换为任意一种想要的字符串。
其中的毫秒部分最大有7位,【fff】表示只取前三位,【fffffff】表示取全部7位。
上面的例子执行结果发现了一个奇怪的问题,执行结果中【dt.ToString = 2007/04/16 15:10:21】,
而【dt.ToString(yyyy/MM/dd hh:mm:ss:fff) = 2007/04/16 03:10:21:714】,两者的小时部分相差了12,
网上好多帖子都说是因为计时开始时间的问题,我觉得肯定是转换时候的问题,不然为什么【ToString()】是正确的,
估计应该是时间表示的问题,试着把【ToString("yyyy/MM/dd HH:mm:ss:fff"))】中的【hh】改成大写的【HH】,执行OK。

dt.ToString(yyyy 13 884 ddHH:mm:ss:fff) 884

特别值得注意的是月【MM】和分【mm】,如果两者写错了很难发现。大小写需要注意的地方:

Year yyyy小写固定
Month MM大写固定
Day dd小写固定
Hour HH或者hh大小写均可
Minute mm小写固定
Second ss小写固定
毫秒Millisecondff或者FF大小写均可(最大7位)

DateTime ))
Debug.WriteLine(
dt.ToString(yyyy/MM/ddhh:mm:ss:fffff)= yyyy/MM/ddhh:mm:ss:fffff dt.ToString(yyyy/MM/ddhh:mm:ss:fffffff)= yyyy/MM/ddhh:mm:ss:fffffff dt.ToString(YYYY/MM/DDHH:MM:SS:FFF)= YYYY/MM/DDHH:MM:SS:FFF dt.ToString(yyyy/mm/ddhh:mm:ss:fff)= yyyy/mm/ddhh:mm:ss:fff ))

结果如下:
dt.ToString(yyyy
887 ddhh:mm:ss:fffff) 88783 ddhh:mm:ss:fffffff) 8878378
dt.ToString(YYYY
DDHH:MM:SS:FFF) YYYY DD :SS: mm

也可以用Format(Date,Format)进行转换

Format (dt, yyyy/MM/ddHH:mm:ss:fff ))

结果如下:
24 09 758

其他的日期型转换为字符型都可以先转换为Date型或者DateTime型,然后再通过ToString转换为字符型。

字符型转换为日期型最直接的方法就是解析日期字符串,取得年,月,日,时,分,秒,组织成日期形式【yyyy/MM/dd】或者【yyyy/MM/dd hh:mm:ss】,然后用CDate转换为日期型

strDate String 20050101
strTime 12:34:56 year strDate.Substring( 0 ,0)">4 )
month 2 day CDate ( strTime) ' 组织成yyyy/MM/ddhh:mm:ss格式 dt2 )
Debug.WriteLine(
dt2.ToString= dt2.ToString)

结果如下:
dt.ToString
2005 01 12 34 56
dt2.ToString
00 00

或者是用DateTime的构造函数,DateTime的构造函数有好多个

名称

说明

DateTime (Int64)

将 DateTime 结构的新实例初始化为指定的刻度数。

DateTime (Int64,DateTimeKind)

将 DateTime 结构的新实例初始化为指定的刻度数以及协调通用时间 (UTC) 或本地时间。

DateTime (Int32,Int32,Int32)

将 DateTime 结构的新实例初始化为指定的年、月和日。

将 DateTime 结构的新实例初始化为指定日历的指定年、月和日。

将 DateTime 结构的新实例初始化为指定的年、月、日、小时、分钟和秒。

将 DateTime 结构的新实例初始化为指定日历的指定年、月、日、小时、分钟和秒。

将 DateTime 结构的新实例初始化为指定年、月、日、小时、分钟、秒和协调通用时间 (UTC) 或本地时间。

将 DateTime 结构的新实例初始化为指定的年、月、日、小时、分钟、秒和毫秒。

将 DateTime 结构的新实例初始化为指定日历的指定年、月、日、小时、分钟、秒和毫秒。

将 DateTime 结构的新实例初始化为指定年、月、日、小时、分钟、秒、毫秒和协调通用时间 (UTC) 或本地时间。

将 DateTime 结构的新实例初始化为指定日历的指定年、月、日、小时、分钟、秒、毫秒和协调通用时间 (UTC) 或本地时间。


还有就是直接定义一个日期型的变量,不过要注意必须是一下格式【MM/dd/yyyy HH:mm:ss.fffffff】,其中【MM/dd/yyyy】是必须项目

d 4/13/200712:34:56.123456PM
Debug.WriteLine(d.ToString(
))

执行结果:
123

2.Double型和日期型之间的转换

在一些数据库中保存日期的时候不是用日期型而是把日期转换成double型之后放入数据库,这样的情况下
就需要将Double转化为日期型。
例如:39188.7805780093 = 2007/04/16 18:44:01:940
39188表示天数,0.7805780093 表示 time.Second/(24*3600)的值。
在DateTime的构造函数里有一个单一参数的构造函数【DateTime (Int64)】将 DateTime 结构的新实例初始化为指定的刻度数(Ticks)。
日期零点值为1899年12月30日0点0分0秒0毫秒以来已经过的时间的以 100 毫微秒为间隔的间隔数。1秒钟是10,000,000 Ticks。
从而可以将Double型先转化为Long型的Ticks,计算方法如下
39188.7805780093 (天)*24(小时)*3600(秒)*10000000(100 毫微秒) = 33859106419400000

dblTicks Double 39188.7805780093 dtime New DateTime(dblTicks * 3600 10000000 dtime.ToString(yyyy/MM/ddHH:mm:ss:fff)= dtime.ToString( ))

执行结果:
dtime.ToString(yyyy
0108 18 44 940

执行结果年日不正确,大概少了1900年,可能是因为从1899年12月30日开始计算的,要把计时开始的时间加上
1899年 12 月 30 日午夜 12:00:00开始的毫微秒数 = 599264352000000000

DateTime( 1899 30 )
Debug.WriteLine(dt.Ticks.ToString)

执行结果:
599264352000000000

将上面的例子改写为下面的样子,结果就正确了

).Ticks)
Debug.WriteLine( 这样的方法用起来肯定很麻烦,DateTime还有另外一个从Double转换为Date型的方法,FromOADate(double),这样子就方便多了。当然,从日期型转换为Double型的话也很方便了,用Date.ToOaDate()就可以了.

DateTime.FromOADate( dt.ToOADate.ToString= dt.ToOADate.ToString)

执行结果:
940
dt.ToOADate.ToString
39188.7805780093

3.Long型和日期型之间的转换

Long型一般是表示为 Windows 文件时间的当前 DateTime 对象的值,它表示自协调通用时间 (UTC) 公元 (C.E.) 1601 年 1 月 1 日午夜 12:00 以来已经过的时间的以 100 毫微秒为间隔的间隔数。Windows 使用文件时间记录应用程序创建、访问或写入文件的时间。用Date.FromFileTime(long)方法。还有一个FromFileTimeUtc(long)方法,是将当前文件时间转换为同时的UTC(协调通用时间)

l Long 128208176211955002 DateTime.FromFileTime( DateTime.FromFileTimeUtc( )
Debug.WriteLine(dt.ToString)
Debug.WriteLine(dt2.ToString)

执行结果:
11 41
在这里是东9区,刚好时间上差了9小时

同样,日期型转换为Long型用Date.ToFileTime()方法。另外还有一个ToFileTimeUtc()方法,两者在指定Kind的情况下是相同的,在没有指定Kind的情况下内容是不同的。
如下例中,DateTimeKind指定DateTime对象是表示本地时间、协调通用时间 (UTC),还是既不指定为本地时间,也不指定为 UTC。Local 表示的时间为本地时间。 Unspecified 表示的时间既未指定为本地时间,也未指定为协调通用时间 (UTC)。 Utc 表示的时间为 UTC。

DateTimeKind=Null )
Debug.WriteLine(dt.ToFileTime.ToString)
Debug.WriteLine(dt.ToFileTimeUtc().ToString)
dt
DateTime.SpecifyKind(dt,DateTimeKind.Unspecified)
Debug.WriteLine(
DateTimeKind=Unspecified DateTimeKind=Local DateTimeKind=Utc )
Debug.WriteLine(dt.ToFileTime.ToString)
Debug.WriteLine(dt.ToFileTimeUtc().ToString)

执行结果:
DateTimeKind
Null

DateTimeKind
Unspecified
128208500211955002 Local
Utc
128208500211955002

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...