DateTime.TryParseExact方法

做日期转换时,使用了DateTime.TryParseExact,那么我们就来看看这个TryParseExact是否在正常工作。
DateTime output;DateTime.TryParseExact("2009-06-04", "yyyy/MM/dd", null, DateTimeStyles.None, out output);Console.WriteLine(output.ToString());

以上代码的输出结果果然让人大跌眼镜,日期居然能正确转换!

难道TryParseExact的第二个参数format没有作用吗?将/改成.,居然又不能转换了:

看来是/这个符号的问题。请出Reflector,将mscorlib.dll反编译,找到DateTime.TryParseExact方法,一步一步跟进去。发现如果该方法的IFormatProvider参数为null,将获取当前线程的CultureInfo的DateTimeFormat属性作为IFormatProvider,然后在DateTimeParse.ParseByFormat方法中,遇到format参数的/字符时,会比较输入日期字符串的当前字符是否为当前DateTimeFormatInfo的DateSeperator,如果是,则返回true,即允许转换,如果不是则返回false。

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;Console.WriteLine(cultureInfo.DateTimeFormat.DateSeparator);

而以上代码输出的恰恰为-,也就是说当前线程的区域信息中,日期分隔符即为-,因此,转换得以成功。

如果您使用

DateTimeFormatInfo dtfi = new CultureInfo("zh-CN", false).DateTimeFormat;DateTime output;DateTime.TryParseExact("2009-06-04", "yyyy/MM/dd", dtfi, DateTimeStyles.None, out output);Console.WriteLine(output.ToString());

则转换失败,因为在初始化CultureInfo时,第二个参数为false意味着不使用用户选定的区域性设置,而使用默认的设置,这时的DateSeparator为/

至此,谜底全部解开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值