VB.NET中的日期时间转换
刚刚学习VB.NET不久,在做几个小例子的时候发现经常要对日期时间和字符串之间进行转换,现整理如下,如有不正确的地方请大家指出。
1.字符型和日期型之间的转换
日期型转换为字符型是最简单的,可以直接转换。
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 15 : 13 : 13 : 884
特别值得注意的是月【MM】和分【mm】,如果两者写错了很难发现。 大小写需要注意的地方:
月 Month MM 大写固定
日 Day dd 小写固定
时 Hour HH或者hh 大小写均可
分 Minute mm 小写固定
秒 Second ss 小写固定
毫秒 Millisecond ff或者FF 大小写均可(最大7位)
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)进行转换
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 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 结构的新实例初始化为指定的刻度数。 | |
将 DateTime 结构的新实例初始化为指定的刻度数以及协调通用时间 (UTC) 或本地时间。 | |
将 DateTime 结构的新实例初始化为指定的年、月和日。 | |
将 DateTime 结构的新实例初始化为指定日历的指定年、月和日。 | |
将 DateTime 结构的新实例初始化为指定的年、月、日、小时、分钟和秒。 | |
DateTime (Int32, Int32, Int32, Int32, Int32, Int32, Calendar) | 将 DateTime 结构的新实例初始化为指定日历的指定年、月、日、小时、分钟和秒。 |
DateTime (Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind) | 将 DateTime 结构的新实例初始化为指定年、月、日、小时、分钟、秒和协调通用时间 (UTC) 或本地时间。 |
将 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】是必须项目
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 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
Debug.WriteLine(dt.Ticks.ToString)
执行结果:
599264352000000000
将上面的例子改写为下面的样子,结果就正确了
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()就可以了.
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 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。
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