前几日一个朋友问我一个时间转换的问题。
http://community.youkuaiyun.com/Expert/topic/4526/4526261.xml?temp=.2506525
他的.Net程序从一个服务器读到一个表示时间的浮点数(变态的服务器),它需要将这个浮点数转换成为.Net中的DateTime类型。
比如, 38733.58621528 = 2006-1-16 14:04:09
具备一点编程常识就知道,整数部分表示日期,小数部分表示时间。问题的关键是0.0表示的时间是什么?也就是说系统从什么时间开始计时。
在Windows的大多数程序中是从1900-1-1开始计时的。而Linux是从1970-1-1开始计时的。.Net中的时间表示范围是从0001-1-1到9999年。经过核实,数据是从SQL Server2000中获取的,所以时间是从1900-1-1开始计时的。
在优快云中的回帖中已经给出了具体的换算方法。但是我并不打算才用。根据我的经验这应该是一个常用功能,所以.Net中一定有现成的函数。我是.Net坚定的拥趸。果然,最终我在.Net的类库我找到了答案。我是如何找到答案的呢?我把我寻找答案的过程列在这里:
第一次尝试,
我打开VS2005,打开一个空白工程,键入System.DataTime然后打“点”,在自动完成功能列出的方法参数列表中查找。浏览了一遍,没有找到“看起来很像”的方法。
这是我习惯采用的一种方法。因为一般遇到问题的时候都是在开发的过程中,VS2005已经打开,随便找一个地方,开始键入[可能的名称空间].[可能的类名],然后打“点”,在弹出来的列表中查找,找到名称可疑的,就进一步看它的参数列表和返回值,以及介绍。在进一步就是查看SDK中的文档。这种方法的特点是可能很快就找到合适的方法,也可能很长时间也找不到,主要看你的思路和.Net的思路是否一致。编程时间越长,经验越丰富,你的思路和.Net的思路就越一致,命中率就越高。这方法还一个好处就是你会发现很多新奇的函数,虽然解决不了现在的问题,但是可能对今后遇到的问题有帮助,是一种积累。
第二次尝试,
既然取巧的方法没有找到答案,那我另找办法。经常使用Excel的朋友都会知道,有时在Excel中输入一个日期,但有时后显示成为一个浮点数。解决方法是,选中该单元格,点击菜单“格式”-“单元格格式”,在“数字”选项卡上将“分类”设置为“日期”。这表明Windows系统一定有一方法可以直接转换。Office12和VBA有着非常密切的关系,我先在VBA中试验一下。在VB和VBA中都有一个日期转换的函数CDATE()。
试验一下
time = CDate(38733.58621528)
Str1 = Format(time, "YYYY-MM-DD HH:mm:ss")
Str1的结果是2006-01-16 14:04:09。Ok。完全正确。
好,现在的问题是,如何在.Net中找到和CDate对应的函数。
有我经常在SDK中浏览.Net的类库,(有点BT,但确实有用),所以我知道有一个名称空间是Microsoft.VisualBasic。(这也是我为什么会想到首先在VB中做实验的原因)在这个名称空间下,有很多模拟VB中函数的方法。让我找一找其中有没有CDate?
打开SDK,找到Microsoft.VisualBasic名称空间,看看里面有哪些类。找到一个DateAndTime Class。里面是Day,Month,Year这些函数,不是我们要找的。再找,找到Conversion Class,这个有门儿,(什么?你问Conversion 是什么意思?就是转换的意思。作为程序员英语阅读可是基础,否则你有了问题就只能等待别人帮你解答了),看一下里面的方法,只有Fix Method, Hex Method, Str Method,Faint!没有Date Method。怎么办? 这时候就要耐心的读文档了。看一下 Conversion Class的Overview。 Syntax,Remark,Example,Inheritance Hierarchy, Thread Safty, Platforms,都没有。别着急,看一下See Also。
好,有一个Conversion Summary的链接。打开看一下。太好了,在这里终于找到了CDate。点击,进入。什么?不是CDate的专题介绍,又是一篇长长文档。一定要耐心,答案已经很接近了,就当是练练英语好了。什么?你说老板催得紧,明天再练英语。没办法,好吧。按下“Ctrl+F”,搜索“CDate”。找啊找啊,终于找到了
OK,然我们回顾一下找到答案的全过程。
OK,我的问题说完了,各位朋友有什么要说的。在优快云的帖子里有各种问题的答案。但是却没有说明是如何找到答案的。我们都知道“授人以鱼,不如授人以渔”的道理。希望以后能够多看到“授人以渔”的文章。
注1,这是一个笑话,一天,老鼠妈妈带着小老鼠外出。忽然遇见一只猫,马上逃跑。眼看就要被猫捉住了,突然老鼠妈妈学了几声狗叫,“汪汪汪”。猫愣了一下,扭头跑掉了。老鼠妈妈教育小老鼠说:“看,这年头多掌握几门外语是多么重要呀。”
http://community.youkuaiyun.com/Expert/topic/4526/4526261.xml?temp=.2506525
他的.Net程序从一个服务器读到一个表示时间的浮点数(变态的服务器),它需要将这个浮点数转换成为.Net中的DateTime类型。
比如, 38733.58621528 = 2006-1-16 14:04:09
具备一点编程常识就知道,整数部分表示日期,小数部分表示时间。问题的关键是0.0表示的时间是什么?也就是说系统从什么时间开始计时。
在Windows的大多数程序中是从1900-1-1开始计时的。而Linux是从1970-1-1开始计时的。.Net中的时间表示范围是从0001-1-1到9999年。经过核实,数据是从SQL Server2000中获取的,所以时间是从1900-1-1开始计时的。
在优快云中的回帖中已经给出了具体的换算方法。但是我并不打算才用。根据我的经验这应该是一个常用功能,所以.Net中一定有现成的函数。我是.Net坚定的拥趸。果然,最终我在.Net的类库我找到了答案。我是如何找到答案的呢?我把我寻找答案的过程列在这里:
第一次尝试,
我打开VS2005,打开一个空白工程,键入System.DataTime然后打“点”,在自动完成功能列出的方法参数列表中查找。浏览了一遍,没有找到“看起来很像”的方法。
这是我习惯采用的一种方法。因为一般遇到问题的时候都是在开发的过程中,VS2005已经打开,随便找一个地方,开始键入[可能的名称空间].[可能的类名],然后打“点”,在弹出来的列表中查找,找到名称可疑的,就进一步看它的参数列表和返回值,以及介绍。在进一步就是查看SDK中的文档。这种方法的特点是可能很快就找到合适的方法,也可能很长时间也找不到,主要看你的思路和.Net的思路是否一致。编程时间越长,经验越丰富,你的思路和.Net的思路就越一致,命中率就越高。这方法还一个好处就是你会发现很多新奇的函数,虽然解决不了现在的问题,但是可能对今后遇到的问题有帮助,是一种积累。
第二次尝试,
既然取巧的方法没有找到答案,那我另找办法。经常使用Excel的朋友都会知道,有时在Excel中输入一个日期,但有时后显示成为一个浮点数。解决方法是,选中该单元格,点击菜单“格式”-“单元格格式”,在“数字”选项卡上将“分类”设置为“日期”。这表明Windows系统一定有一方法可以直接转换。Office12和VBA有着非常密切的关系,我先在VBA中试验一下。在VB和VBA中都有一个日期转换的函数CDATE()。
试验一下
time = CDate(38733.58621528)
Str1 = Format(time, "YYYY-MM-DD HH:mm:ss")
Str1的结果是2006-01-16 14:04:09。Ok。完全正确。
好,现在的问题是,如何在.Net中找到和CDate对应的函数。
有我经常在SDK中浏览.Net的类库,(有点BT,但确实有用),所以我知道有一个名称空间是Microsoft.VisualBasic。(这也是我为什么会想到首先在VB中做实验的原因)在这个名称空间下,有很多模拟VB中函数的方法。让我找一找其中有没有CDate?
打开SDK,找到Microsoft.VisualBasic名称空间,看看里面有哪些类。找到一个DateAndTime Class。里面是Day,Month,Year这些函数,不是我们要找的。再找,找到Conversion Class,这个有门儿,(什么?你问Conversion 是什么意思?就是转换的意思。作为程序员英语阅读可是基础,否则你有了问题就只能等待别人帮你解答了),看一下里面的方法,只有Fix Method, Hex Method, Str Method,Faint!没有Date Method。怎么办? 这时候就要耐心的读文档了。看一下 Conversion Class的Overview。 Syntax,Remark,Example,Inheritance Hierarchy, Thread Safty, Platforms,都没有。别着急,看一下See Also。
好,有一个Conversion Summary的链接。打开看一下。太好了,在这里终于找到了CDate。点击,进入。什么?不是CDate的专题介绍,又是一篇长长文档。一定要耐心,答案已经很接近了,就当是练练英语好了。什么?你说老板催得紧,明天再练英语。没办法,好吧。按下“Ctrl+F”,搜索“CDate”。找啊找啊,终于找到了
Date/Time Conversions. Use the IsDate Function (Visual Basic) to determine if a value can be converted to a date and time. CDate recognizes date literals and time literals but not numeric values. To convert a Visual Basic 6.0 Date value to a Visual Basic 2005 Date value, you can use the System.DateTime.FromOADate(System.Double) method.
一定要耐心,英语就是这样炼成的。找到了吗?System.DateTime.FromOADate(System.Double),就是这个方法。OK,然我们回顾一下找到答案的全过程。
步骤 | 采用方法 | 结果 | 点评 |
1 | 在VS2005中,使用打“点”法,狂搜 | 失败 | 没什么技术含量,和经验和运气有关。 |
2 | 在Excel中试验 | 证实确实有简便方法 | 多使用一些软件,建立对软件的感觉。 |
3 | 在VBA中试验CDATE | 证实CDate函数起作用 | 身为程序员,即使进入.Net时代,也应该多掌握几门语言。 连老鼠都知道多掌握几门外语的重要性。注1 |
4 | 在SDK中查找Microsoft.VisualBasic 中的CDate函数。 | 找啊找啊 | 任何工作都要注重平时的积累。 |
5 | 查找Coversion Class | 在Overview中没有找到,但是找到了 Conversion Summary的链接 | 不要放弃,高手也许就是多了一点耐心。 英语阅读也很重要。 |
6 | 仔细阅读Conversion Summary | 终于找到了 System.DateTime.FromOADate(System.Double) | 耐心,还是耐心。你能否解决一个问题取决于你解决这个问题的决心。 |
OK,我的问题说完了,各位朋友有什么要说的。在优快云的帖子里有各种问题的答案。但是却没有说明是如何找到答案的。我们都知道“授人以鱼,不如授人以渔”的道理。希望以后能够多看到“授人以渔”的文章。
注1,这是一个笑话,一天,老鼠妈妈带着小老鼠外出。忽然遇见一只猫,马上逃跑。眼看就要被猫捉住了,突然老鼠妈妈学了几声狗叫,“汪汪汪”。猫愣了一下,扭头跑掉了。老鼠妈妈教育小老鼠说:“看,这年头多掌握几门外语是多么重要呀。”