C#中DateTime获取指定yyyy-MM-dd日期格式失败,请求技术支持
解决日期格式转换错误的问题
咱们先拆解你代码里的问题:
你前面的代码其实已经正确把原始日期字符串转成了yyyy-MM-dd格式的字符串d:
var d = Convert.ToDateTime("2018-03-20T00:00:00.000", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd"); // 这里d的值已经是"2018-03-20"了
但后面的DateTime.TryParseExact用法完全错了:这个方法返回的是布尔值(表示解析是否成功),而不是日期对象。而且你传了null作为格式提供器,这会使用当前线程的默认文化(比如如果是英国/澳洲地区的文化,日期格式默认是dd/MM/yyyy),这也是导致你最终输出错误格式的核心原因。
正确的做法分两种情况:
如果你只需要
yyyy-MM-dd格式的字符串:
直接用你已经得到的d就可以了,完全不需要后续的TryParseExact步骤。如果你需要把字符串转回
DateTime对象,同时确保格式合规:
要使用TryParseExact的正确重载,它需要一个输出参数来接收解析后的日期,并且指定不变文化避免格式受系统设置干扰:// 第一步先得到正确的格式化字符串 var d = Convert.ToDateTime("2018-03-20T00:00:00.000", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd"); DateTime parsedDate; // 使用TryParseExact的正确重载,指定InvariantCulture避免系统文化干扰 bool parseSuccess = DateTime.TryParseExact(d, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate); if (parseSuccess) { // 如果要输出字符串,再转一次确保格式稳定 string finaldate = parsedDate.ToString("yyyy-MM-dd"); // 此时finaldate就是"2018-03-20" } else { // 这里可以处理解析失败的异常情况 }
额外优化建议:
如果你从一开始就想把原始的"2018-03-20T00:00:00.000"直接转成yyyy-MM-dd格式的字符串,其实可以一步到位,不用先转成DateTime再ToString,更高效也更稳妥:
DateTime originalDate; if (DateTime.TryParseExact("2018-03-20T00:00:00.000", "yyyy-MM-ddTHH:mm:ss.fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out originalDate)) { string finaldate = originalDate.ToString("yyyy-MM-dd"); // 结果就是"2018-03-20" }
内容的提问来源于stack exchange,提问作者user1627923
相关产品推荐
相关产品推荐

