DateTime.TryParseExact无法识别字符串中的中文上午/下午标识
为啥TryParseExact解析带中文上午/下午的日期会失败?
我太懂这个坑了!DateTime.TryParse能成功是因为它会“灵活”适配系统的本地化设置,自动识别中文的“上午/下午”;但TryParseExact是个“死心眼”,必须严格匹配你指定的格式和对应的文化信息,稍微不对就直接返回默认值。
你大概率是在调用TryParseExact的时候用了默认的InvariantCulture(对应英文的AM/PM),但你的日期字符串里是中文的“下午”,这俩完全不搭,自然解析失败。
怎么解决?
很简单,给TryParseExact指定中文(中国)的文化信息,同时确保格式字符串里用tt对应中文的上午/下午标识就行。
给你写个能跑的示例代码:
using System; using System.Globalization; class DateParseTest { static void Main() { string targetDate = "2/9/2018 3:55:17 下午"; // TryParse自动识别本地化,成功解析 DateTime parsedDate; DateTime.TryParse(targetDate, out parsedDate); Console.WriteLine($"Date: {parsedDate}"); // TryParseExact指定中文文化,严格匹配格式 DateTime exactParsedDate; bool isSuccess = DateTime.TryParseExact( targetDate, "M/d/yyyy h:mm:ss tt", CultureInfo.GetCultureInfo("zh-CN"), DateTimeStyles.None, out exactParsedDate ); Console.WriteLine($"DateExact: {exactParsedDate}"); } }
运行这段代码后,DateExact就会输出正确的日期时间,而不是默认的1/1/0001 12:00:00 AM了。
额外小提示
- 如果你的日期字符串格式可能有变体(比如有时候是
02/09带前导零,有时候是2/9),可以给TryParseExact传一个格式数组,比如new string[] { "M/d/yyyy h:mm:ss tt", "MM/dd/yyyy hh:mm:ss tt" },这样就能兼容多种格式了。 - 格式字符串一定要和目标字符串完全对应,比如日期部分是
2/9就用M/d,别用MM/dd,不然也会匹配失败。
内容的提问来源于stack exchange,提问作者Jace
相关产品推荐
相关产品推荐

