咨询区
Shantanu Gupta:
我在项目中碰到了一个需求,需要将字符串格式的 dd/MM/yyyy
转成 DateTime,比如下面这样:
class Program{static void Main(string[] args){var str= "22/11/2009";DateTime date = DateTime.Parse(str);}}
但很不幸,我的代码抛出异常了。
请问我该如何解决?不过我还意外发现 Parse
方法还有一个 IFormatProvider 参数的重载,不清楚是否它能解决?如果可以的话该怎么传?
回答区
Samuel Neff:
你可以使用 ParseExact
方法,它需要你指定强转成 DateTime 需要的字符串格式,方法签名如下:
public static DateTime ParseExact(string s, string format, IFormatProvider? provider){}
所以你应该像下面这样使用。
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
值得一提的是,IFormatProvider 一定要适配该时间字符串格式的区域 Cluture
,如果不确定的话,可以使用通用的 CultureInfo.InvariantCulture
。
Ricardo Sanchez:
其实你抛异常的本质在于,你当前 Culture
的时间格式和你的需要强转的 字符串时间格式
是冲突的,要想解决的话,调整到正确的 Cluture
即可,参考如下代码。
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyythis.Text="22/11/2009";DateTime date = DateTime.Parse(this.Text);
或者改成这样。
using System.Globalization;DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("en-GB"));
更多细节,参考这个链接:http://msdn.microsoft.com/en-us/library/5hh873ya.aspx
点评区
这个问题我其实挺感慨的,去年做新加坡的项目就被这玩意坑过,我们中国的时间格式大多是:yyyy/MM/dd
,新加坡的格式是这样的:Fri 30 Oct 22 2009
,对,你没有看错,居然还有英文字母缩写,这两格式之间倒来倒去,绝对让你防不胜防 ????????????