将字符串转换为日期时间格式
本文关键字:时间 格式 日期 字符串 转换 | 更新日期: 2023-09-27 18:32:17
我正在尝试使用以下方法将09/01/2015 00:00:00
解析为yyyy-MM-ddThh:mm:ssZ
格式:
DateTime.ParseExact("09/01/2015 00:00:00", "yyyy-MM-ddThh:mm:ssZ", (IFormatProvider)CultureInfo.InvariantCulture);
但我越来越String was not recognized as a valid DateTime
谁能告诉我为什么?我相信09/01/2015 00:00:00
有效的日期时间格式?
来自 DateTime.ParseExact
将日期和时间的指定字符串表示形式转换为其 日期时间等效。字符串表示形式的格式必须 完全匹配指定的格式,否则将引发异常。
在您的情况下,它们不是。
我假设您的09
部分是日数字,您可以使用dd/MM/yyyy HH:mm:ss
格式。
var dt = DateTime.ParseExact("09/01/2015 00:00:00",
"dd/MM/yyyy HH:mm:ss",
CultureInfo.InvariantCulture);
由于CultureInfo
已经实现了IFormatProvider
,因此不需要显式强制转换它。
我不明白这一点。所以这意味着我首先必须纠正我的字符串 其次,我可以做一个ParseExact()。我认为ParseExact可以 处理给定的字符串...
ParseExact
不是一种神奇的方法,可以解析您提供的任何格式化字符串。仅当字符串和格式根据所使用的区域性设置完全匹配时,它才能处理。
试试这段代码:
var text = "09/01/2015 00:00:00";
var format = "dd/MM/yyyy HH:mm:ss";
var dt = DateTime.ParseExact(text, format, (IFormatProvider)CultureInfo.InvariantCulture);
您会注意到,格式必须在结构上与您尝试解析的文本完全匹配 - 因此该方法ParseExact
名称。
格式不匹配,您需要将09/01/2015
更改为2015-01-09
或将yyyy-MM-dd
部分更改为dd/MM/yyyy
。
ParseExact-method不是将任何dateformat转换为另一个dateformat的终极方法,它只是使用提供的格式将给定的字符串解析为datetime。因此,如果您的 inout 与此格式不匹配,该方法将引发该异常。
由于日期时间在内部只是一个数字,因此根本不需要将一种格式转换为另一种格式,因此只要您知道您的输入格式,您就可以从中构建一个日期,这与您想要打印该日期时可能需要的任何格式无关输出。在这种情况下,您将需要一个格式化程序。
正如大多数人所说,错误来自字符串格式的日期与您所说的格式不匹配的事实。您说 09/01/2015 00:00:00 的格式为"yyyy-MM-ddThh:mm:ssZ",但事实并非如此,因此出现错误。要纠正此问题,您需要更改字符串的格式,或者更有可能更改您所说的日期所在的格式。因此,将"yyyy-MM-ddThh:mm:ssZ"更改为"dd/MM/yyyy HH:mm:ss"。
从更长远的角度来看,您是如何到达这个日期的?格式是否有可能更改(输入但用户)?如果是这样,最好尝试避免抛出错误并使用TryParseExact更好地处理它。为了最好地利用这一点,我通常会输出一个可为空的日期时间,然后检查它是否为空。如果不这样做,那么如果解析失败,它只会使输出日期时间成为最小值。
这样的事情应该有效:
public DateTime? StringToDate (string dateString, string dateFormat)
{
DateTime? dt;
DateTime.TryParseExact(dateString, dateFormat, null, System.Globalization.DateTimeStyles.None, out dt);
return dt;
}
然后你可以像这样使用它:
DateTime? MyDateTime = StringToDate("09/01/2015 00:00:00", "dd/MM/yyyy HH:mm:ss");
if(MyDateTime != null)
{
//do something
}
另一种简单的方法...
var dt = Convert.ToDateTime(Convert.ToDateTime("09/01/2015 00:00:00").ToString("yyyy-MM-ddThh:mm:ssZ"))