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
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页