学习之路六:奇怪的DataTime转换以及格式化问题
2012-03-01 18:54
363 查看
写这篇文章存属偶然,因为最近项目中总是会报同样的错误,我试图改了很多次还是没有对,今天仔细的看了一下,发现了一点蛛丝马迹!
1.这是有关DateTime类型格式化以及转化的问题
调试结果让我惊讶了一下:
通过实验,终于找到了错误的根源所在!
错误所在:①首先我先把时间进行了格式化输出!
②然后再把格式化的时间转换成DateTime类型!
③最后输出的结果不一致了,导致了程序出错了!
解决办法:因此我需要丰富一下格式化的形式 → 改为“yyyy-MM-dd”,这样就能保证时间的一致性了,不会在转换过程中出现误差了!
思考:这种错误是我不细心导致的,没有人不犯错,但是遇到错误能够及时解决并弄懂它就是好样的!
2.追根溯源
问题解决了,可心理还是有个疙瘩,为什么会默认在前面加上“19”呢,为什么不还原成我以前的时间!
通过ILSpy工具单步调试,终于发现了这种现象出现的根源所在了!
①首先代码会检测你的年份是否是小于0,还是大于0且小于100,还是大于9999?
如果小于100,就会自动帮你补全前面两位数字!
②方法调用步骤
I,
II,
III,找到下面调用方法的位置,点击查看
IIII,
IV,
IIV,因为TwoDigitYearMax是一个重写属性,所以必须使用调试技术才能看到真正调用的属性,不调试只能看到虚方法!
总结:到了这一步,源头已经找出来了,如果大家还想看可以继续点下去,我敢保证,方法的返回永远是2029!
③总结规律
为了发现当两位数的年份在什么范围的时候返回的是“1900”,还是“2000”,为此做了个小实验!
从这个可以发现,当你的年份后两位数是小于29的时候是不出现什么异常现象的,当大于29的时候,代码会自动帮你补全变为 → 1900 + 你的后两位年份!
最后:发现这个存属因为我的粗心大意,所以大家对待问题要仔细全面才好!
3.常见的时间格式化方法
①:固定参数格式说明:
②:自定义日期格式化模式:
这种模式很严格必须区分大小写的!
因此通过上面的各种格式可以组成更多的时间格式,千变万化,你也可以使用各种连接符号,把日期进行分割,如:“-”,“:”,“#”,“=”,“+”等等!
你也可以使用String.Format来代替ToString方法,格式还是一样的!
4.两个时间比较方法
①比较时间大小的实验
Public int DateTime.Compare(DateTime one,DateTime two)
返回值:① 1 → 说明 one > two
② -1 → 说明 one < two
③ 0 → 说明 one = two
②计算两个时间差值的函数,返回时间差的绝对值
最后:写代码也需要细心,菜鸟之言,希望园友多多指教!
1.这是有关DateTime类型格式化以及转化的问题
Console.WriteLine("无格式化:"+DateTime.Now.AddMonths(1010).ToString()); Console.WriteLine(string.Format("格式化了 → {0:yy-MM-dd}", DateTime.Now.AddMonths(1010))); string str = Convert.ToDateTime(string.Format("{0:yy-MM-dd}", DateTime.Now.AddMonths(1010))).ToString(); Console.WriteLine("格式化了,但又转换了:"+str);
调试结果让我惊讶了一下:
通过实验,终于找到了错误的根源所在!
错误所在:①首先我先把时间进行了格式化输出!
②然后再把格式化的时间转换成DateTime类型!
③最后输出的结果不一致了,导致了程序出错了!
解决办法:因此我需要丰富一下格式化的形式 → 改为“yyyy-MM-dd”,这样就能保证时间的一致性了,不会在转换过程中出现误差了!
思考:这种错误是我不细心导致的,没有人不犯错,但是遇到错误能够及时解决并弄懂它就是好样的!
2.追根溯源
问题解决了,可心理还是有个疙瘩,为什么会默认在前面加上“19”呢,为什么不还原成我以前的时间!
通过ILSpy工具单步调试,终于发现了这种现象出现的根源所在了!
①首先代码会检测你的年份是否是小于0,还是大于0且小于100,还是大于9999?
如果小于100,就会自动帮你补全前面两位数字!
②方法调用步骤
I,
II,
III,找到下面调用方法的位置,点击查看
IIII,
IV,
IIV,因为TwoDigitYearMax是一个重写属性,所以必须使用调试技术才能看到真正调用的属性,不调试只能看到虚方法!
总结:到了这一步,源头已经找出来了,如果大家还想看可以继续点下去,我敢保证,方法的返回永远是2029!
③总结规律
为了发现当两位数的年份在什么范围的时候返回的是“1900”,还是“2000”,为此做了个小实验!
public static void GetValue() { Console.WriteLine("-----------------求值--------------------"); int count = 0; for (int i = 1; i < 100; i++) { count = (2029 / 100 - ((i > 2029 % 100) ? 1 : 0)) * 100; Console.WriteLine(count + "\t" + i); } //临界值为29,当你的年份后两位数是小于等于29的时候是不出现奇怪现象的,大于29后,系统会自动把年份设置为 → “19”+加你的后两位年份 }
从这个可以发现,当你的年份后两位数是小于29的时候是不出现什么异常现象的,当大于29的时候,代码会自动帮你补全变为 → 1900 + 你的后两位年份!
最后:发现这个存属因为我的粗心大意,所以大家对待问题要仔细全面才好!
3.常见的时间格式化方法
①:固定参数格式说明:
格式化字符 | 属性/说明/日期格式 |
D | 2012年2月29日 |
d | 2012-2-29 |
F | 2012年2月29日 15:02:04 |
f | 2012年2月29日 15:02 (不带秒数) |
G | 2012-2-29 15:02:04 |
g | 2012-2-29 15:02 (不带秒数) |
Y | 2012年2月 |
y | 2012年2月 |
这种模式很严格必须区分大小写的!
自定义格式化字符 | 属性/说明/日期格式 |
y,yy,yyy,yyyy | 年份 |
M,MM,MMM,MMMM | 月份 |
d,dd,ddd,dddd | 天数 |
hh | 12小时制 |
HH | 24小时制 |
m,mm | 分 |
s,ss | 秒 |
f,ff,fff,ffff,fffff,ffffff,fffffff | 秒的精确,一个f代表一个精度 |
你也可以使用String.Format来代替ToString方法,格式还是一样的!
4.两个时间比较方法
①比较时间大小的实验
Public int DateTime.Compare(DateTime one,DateTime two)
返回值:① 1 → 说明 one > two
② -1 → 说明 one < two
③ 0 → 说明 one = two
②计算两个时间差值的函数,返回时间差的绝对值
public static void Compare() { DateTime one = DateTime.Now.AddDays(1); DateTime two = DateTime.Now; TimeSpan oneSpan = new TimeSpan(one.Ticks); TimeSpan twoSpan = new TimeSpan(two.Ticks); TimeSpan threeSpan = oneSpan.Subtract(twoSpan).Duration(); Console.WriteLine("天数-{0},小时-{1},分钟-{2},秒-{3}", threeSpan.Days, threeSpan.Hours, threeSpan.Minutes, threeSpan.Seconds); }
最后:写代码也需要细心,菜鸟之言,希望园友多多指教!
相关文章推荐
- 关于使用LayoutParams清除设置以及DateFormat无法正确转换格式化日期的问题
- UTC、GMT、Unix Time、Unix epoch、POSIX time、Unix timestamp以及本机时间转换 问题
- time(0)时间转换,以及时差带来的问题
- mysql数据库中“0000-00-00 00:00:00”格式无法转换成datatime类型的问题解决方法
- Java写的手机计费系统(作为学习参考的实例:关键是Java类库里面的date和Calendar的使用和相互转换,以及一些日期的实际问题)
- linux获取本地时间以及转换成time_t类型
- sql 时间转换问题 from_unixtime() UNIX_TIMESTAMP()
- Python之time模块的时间戳、时间字符串格式化与转换(13位时间戳)
- Ubuntu学习记录、遇到的问题以及解决办法
- 在android中如何查看sqlite数据表结构,以及data文件打不开问题
- c# DataTime.toString()的显示精度问题
- 我的第一篇android学习博客,以及Activity活动的标题栏隐藏问题
- Scrapy 入门学习笔记(3) -- 使用 Item 类转换传输数据以及ItemLoader 机制解析
- VC6 和 VS2003 转换到VS2005 时可能会遇到的问题以及解决方法
- 如何将时间序列预测问题转换为python中的监督学习问题
- sql 时间转换问题 from_unixtime() UNIX_TIMESTAMP()
- 学习之路十二:SQL Server操作XML以及遇到的问题
- Combobox出现System.Data.DataRowView的原因,以及指定ValueMember的时机问题
- cocos2d-X入门(win7+VS2012环境配置以及学习中遇到的问题)
- Dataformatstring 格式化日期应注意的问题