您的位置:首页 > 编程语言 > VB

VB.NET中的日期时间转换

2007-04-17 13:32 501 查看

VB.NET中的日期时间转换

刚刚学习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/dd hh:mm:ss:fff) = " + dt.ToString("yyyy/MM/dd hh:mm:ss:fff"))




结果如下:


dt.ToLongDateString = 2007年4月16日


dt.ToLongTimeString = 15:10:21


dt.ToShortDateString = 2007/04/16


dt.ToShortTimeString = 15:10


dt.ToFileTime = 128211774217140929


dt.ToFileTimeUtc = 128211774217140929


dt.ToLocalTime = 2007/04/16 15:10:21


dt.ToOADate = 39188.6321957639


dt.ToUniversalTime = 2007/04/16 6:10:21


dt.ToString = 2007/04/16 15:10:21


dt.ToString(yyyy/MM/dd hh:mm:ss:fff) = 2007/04/16 03:10:21: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/MM/dd hh:mm:ss:fff) = 2007/04/16 03:13:13:884


dt.ToString(yyyy/MM/dd HH:mm:ss:fff) = 2007/04/16 15:13:13:884

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


年 Year yyyy 小写固定


月 Month MM 大写固定


日 Day dd 小写固定


时 Hour HH或者hh 大小写均可


分 Minute mm 小写固定


秒 Second ss 小写固定


毫秒 Millisecond ff或者FF 大小写均可(最大7位)


Dim dt As DateTime = Now


Debug.WriteLine("dt.ToString(yyyy/MM/dd hh:mm:ss:fff) = " + dt.ToString("yyyy/MM/dd hh:mm:ss:fff"))


Debug.WriteLine("dt.ToString(yyyy/MM/dd hh:mm:ss:fffff) = " + dt.ToString("yyyy/MM/dd hh:mm:ss:fffff"))


Debug.WriteLine("dt.ToString(yyyy/MM/dd hh:mm:ss:fffffff) = " + dt.ToString("yyyy/MM/dd hh:mm:ss:fffffff"))


Debug.WriteLine("dt.ToString(YYYY/MM/DD HH:MM:SS:FFF) = " + dt.ToString("YYYY/MM/DD HH:MM:SS:FFF"))


Debug.WriteLine("dt.ToString(yyyy/mm/dd hh:mm:ss:fff) = " + dt.ToString("yyyy/mm/dd hh:mm:ss:fff"))




结果如下:


dt.ToString(yyyy/MM/dd hh:mm:ss:fff) = 2007/04/16 03:15:13:887


dt.ToString(yyyy/MM/dd hh:mm:ss:fffff) = 2007/04/16 03:15:13:88783


dt.ToString(yyyy/MM/dd hh:mm:ss:fffffff) = 2007/04/16 03:15:13:8878378


dt.ToString(YYYY/MM/DD HH:MM:SS:FFF) = YYYY/04/DD 15:04:SS:887


dt.ToString(yyyy/mm/dd hh:mm:ss:fff) = 2007/15/16 03:15:13:887

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


Dim dt As DateTime = Now


Debug.WriteLine(Format(dt, "yyyy/MM/dd HH:mm:ss:fff"))




结果如下:


2007/04/16 16:24:09:758

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

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


Dim strDate As String = "20050101"


Dim strTime As String = "12:34:56"


Dim year As String = strDate.Substring(0, 4)


Dim month As String = strDate.Substring(4, 2)


Dim day As String = strDate.Substring(6, 2)


Dim dt As Date = CDate(year + "/" + month + "/" + day + " " + strTime) '组织成 yyyy/MM/dd hh:mm:ss 格式


Dim dt2 As Date = CDate(year + "/" + month + "/" + day)


Debug.WriteLine("dt.ToString = " + dt.ToString)


Debug.WriteLine("dt2.ToString = " + dt2.ToString)




结果如下:


dt.ToString = 2005/01/01 12:34:56


dt2.ToString = 2005/01/01 0:00:00

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

名称

说明

DateTime (Int64)

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

DateTime (Int64, DateTimeKind)

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

DateTime (Int32, Int32, Int32)

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

DateTime (Int32, Int32, Int32, Calendar)

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

DateTime (Int32, Int32, Int32, Int32, Int32, Int32)

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

DateTime (Int32, Int32, Int32, Int32, Int32, Int32, Calendar)

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

DateTime (Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind)

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

DateTime (Int32, Int32, Int32, Int32, Int32, Int32, Int32)

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

DateTime (Int32, Int32, Int32, Int32, Int32, Int32, Int32, Calendar)

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

DateTime (Int32, Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind)

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

DateTime (Int32, Int32, Int32, Int32, Int32, Int32, Int32, Calendar, DateTimeKind)

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

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


Dim d As DateTime = "4/13/2007 12:34:56.123456 PM"


Debug.WriteLine(d.ToString("yyyy/MM/dd HH:mm:ss:fff"))




执行结果:


2007/04/13 12:34:56: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


Dim dblTicks As Double = 39188.7805780093


Dim dtime As DateTime = New DateTime(dblTicks * 24 * 3600 * 10000000)


Debug.WriteLine("dtime.ToString(yyyy/MM/dd HH:mm:ss:fff) = " + dtime.ToString("yyyy/MM/dd HH:mm:ss:fff"))




执行结果:


dtime.ToString(yyyy/MM/dd HH:mm:ss:fff) = 0108/04/18 18:44:01:940

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


Dim dt As DateTime = New DateTime("1899", "12", "30")


Debug.WriteLine(dt.Ticks.ToString)




执行结果:


599264352000000000

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


Dim dblTicks As Double = 39188.7805780093


Dim dtime As DateTime = New DateTime(dblTicks * 24 * 3600 * 10000000 + New DateTime("1899", "12", "30").Ticks)


Debug.WriteLine("dtime.ToString(yyyy/MM/dd HH:mm:ss:fff) = " + dtime.ToString("yyyy/MM/dd HH:mm:ss:fff"))




执行结果:


dtime.ToString(yyyy/MM/dd HH:mm:ss:fff) = 2007/04/16 18:44:01:940

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


Dim dt As DateTime = DateTime.FromOADate(39188.7805780093)


Debug.WriteLine(Format(dt, "yyyy/MM/dd HH:mm:ss:fff"))


Debug.WriteLine("dt.ToOADate.ToString = " + dt.ToOADate.ToString)




执行结果:


2007/04/16 18:44:01: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(协调通用时间)


Dim l As Long = 128208176211955002


Dim dt As DateTime = DateTime.FromFileTime(128208176211955002)


Dim dt2 As DateTime = DateTime.FromFileTimeUtc(128208176211955002)


Debug.WriteLine(dt.ToString)


Debug.WriteLine(dt2.ToString)




执行结果:


2007/04/12 11:13:41


2007/04/12 2:13:41


现在这里是东9区,刚好时间上差了9小时

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


Dim dt As DateTime = DateTime.FromFileTime(128208176211955002)


Debug.WriteLine("DateTimeKind = Null")


Debug.WriteLine(dt.ToFileTime.ToString)


Debug.WriteLine(dt.ToFileTimeUtc().ToString)


dt = DateTime.SpecifyKind(dt, DateTimeKind.Unspecified)


Debug.WriteLine("DateTimeKind = Unspecified")


Debug.WriteLine(dt.ToFileTime.ToString)


Debug.WriteLine(dt.ToFileTimeUtc().ToString)


dt = DateTime.SpecifyKind(dt, DateTimeKind.Local)


Debug.WriteLine("DateTimeKind = Local")


Debug.WriteLine(dt.ToFileTime.ToString)


Debug.WriteLine(dt.ToFileTimeUtc().ToString)


dt = DateTime.SpecifyKind(dt, DateTimeKind.Utc)


Debug.WriteLine("DateTimeKind = Utc")


Debug.WriteLine(dt.ToFileTime.ToString)


Debug.WriteLine(dt.ToFileTimeUtc().ToString)




执行结果:


DateTimeKind = Null


128208176211955002


128208176211955002


DateTimeKind = Unspecified


128208176211955002


128208500211955002


DateTimeKind = Local


128208176211955002


128208176211955002


DateTimeKind = Utc


128208500211955002


128208500211955002
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: