C# 日期数据转换为字符串再转换为日期时要注意的一点

我最近作的一个项目出现了下面这样的bug。(实际代码比这个复杂的多,这里只是演示这个bug的产生。)

 
 
DateTime dt1 = new DateTime( 2005 , 5 , 31 , 15 , 31 , 00 ); string strDateTime = dt1.ToString( " u " ); // ...... 一些数据传递操作 DateTime dt2 = DateTime.Parse(strDateTime); int h = dt2.Hour;

DateTime类型的变量被转换成字符串,然后这个字符串又到处传递,走了很复杂的路,在接受方接受到这个字符串后,并再转换为DateTime格式,这时候两个时间的小时数不一样了。

上面演示中,dt1的 Hour 是 15 ,dt2 的 Hour 是 23。 进而造成我所碰到的这个bug。

解决方法,

 
 
DateTime dt1 = new DateTime( 2005 , 5 , 31 , 15 , 31 , 00 ); string strDateTime = dt1.ToString( " u " ); DateTime dt2 = DateTime.Parse(strDateTime, null ,
System.Globalization.DateTimeStyles.AdjustToUniversal);
int h = dt2.Hour;

或者

 
 
DateTime dt1 = new DateTime( 2005 , 5 , 31 , 15 , 31 , 00 ); string strDateTime = dt1.ToString(); DateTime dt2 = DateTime.Parse(strDateTime); int h = dt2.Hour;

我猜想原因应该是:
我本机日期设置是某种格式,我转换为字符串的时候,用了不是我本机的这种格式(使用了UniversalSortableDateTimePattern 这种格式( using the format for universal time display )),而转换回去的时候,确用了本机默认格式,就造成了这个问题。解决方法就是通用一个识别格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值