一个时间转换的问题,顺便谈谈搜索技巧
2006-02-22 15:53
447 查看
前几日一个朋友问我一个时间转换的问题。
http://community.csdn.net/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开始计时的。
在CSDN中的回帖中已经给出了具体的换算方法。但是我并不打算才用。根据我的经验这应该是一个常用功能,所以.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,然我们回顾一下找到答案的全过程。
OK,我的问题说完了,各位朋友有什么要说的。在CSDN的帖子里有各种问题的答案。但是却没有说明是如何找到答案的。我们都知道“授人以鱼,不如授人以渔”的道理。希望以后能够多看到“授人以渔”的文章。
注1,这是一个笑话,一天,老鼠妈妈带着小老鼠外出。忽然遇见一只猫,马上逃跑。眼看就要被猫捉住了,突然老鼠妈妈学了几声狗叫,“汪汪汪”。猫愣了一下,扭头跑掉了。老鼠妈妈教育小老鼠说:“看,这年头多掌握几门外语是多么重要呀。”
http://community.csdn.net/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开始计时的。
在CSDN中的回帖中已经给出了具体的换算方法。但是我并不打算才用。根据我的经验这应该是一个常用功能,所以.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) | 耐心,还是耐心。你能否解决一个问题取决于你解决这个问题的决心。 |
注1,这是一个笑话,一天,老鼠妈妈带着小老鼠外出。忽然遇见一只猫,马上逃跑。眼看就要被猫捉住了,突然老鼠妈妈学了几声狗叫,“汪汪汪”。猫愣了一下,扭头跑掉了。老鼠妈妈教育小老鼠说:“看,这年头多掌握几门外语是多么重要呀。”
相关文章推荐
- 一个时间转换的问题,顺便谈谈搜索技巧
- 关于一个时间的转换问题。由一个RFC3339时间格式的字符串转为本地时间
- 【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高) 这段时间一直在搞视频格式的转换问题,终于最近将一个图片的YUV
- Unix时间戳转换成普通时间一个隐藏的问题
- 一个比较愚蠢的办法,解决excel表,关于导出时间类型转换成QString的问题
- oracle多语言环境下to_date时间转换问题
- 说出来你可能不信!莫名其妙的问题浪费了一个下午的时间!!
- 谈谈Nullable<T>的类型转换问题
- 一个字符串转换的问题
- 用广度优先搜索解一个NOI迷宫问题
- 素数距离问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数
- c语言的一个技巧问题
- 翻译《有关编程、重构及其他的终极问题?》——6.当把一个指针明确的转换为整型时,请检查所有相关代码
- 如何将时间序列预测问题转换为python中的监督学习问题
- MS CRM2011 关于从数据库读取时间并在前台用JS显示时,时间转换的问题
- 一个关于Oracle更新语句引发的时间字段类型的问题
- sql 时间转换问题 from_unixtime() UNIX_TIMESTAMP()
- javascript入门·脚本执行的时间的四种类型(赠送一个转换的小例题)
- oracle中时间转换的问题
- to_date函数与当前系统时间格式可否隐式转换问题总结