此字符串由我尝试调试的应用程序生成。 DateTime.Parse有效,但DateTime.ParseExact不起作用。继续抛出一个糟糕的格式异常。
// test
string dateTimeFormatted = "2014-11-10T14:49:24-06:00";
try
{
//yyyy-MM-ddTHH:mm:sszzz 2014-11-10T14:49:24-06:00
DateTime myDate = DateTime.ParseExact(dateTimeFormatted,
"yyyy-MM-ddTHH:mm:sszzz", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None);
return myDate;
}
catch (Exception)
{
try
{
// This works
DateTime myDate2 = DateTime.Parse(dateTimeFormatted);
return myDate2;
}
catch (Exception)
{
throw;
}
}
编辑:
这是我写的最终方法似乎完美无缺。由于在应用程序生成此时间戳之后不久调用该方法,因此如果DateTime.ParseExact和DateTime.Parse都失败,它将只使用Datetime.Now。
public DateTime GetDateTimeFromFormattedString(string dateTimeFormatted)
{
try
{
//test data 2014-11-10T14:49:24-06:00
DateTime myDate;
bool bIsParsed = DateTime.TryParseExact(dateTimeFormatted.Trim(),
"yyyy'-'MM'-'dd'T'HH':'mm':'sszzz", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, out myDate);
if (bIsParsed)
return myDate;
else
bIsParsed = DateTime.TryParse(dateTimeFormatted.Trim(), out myDate);
if (bIsParsed)
return myDate;
else
return DateTime.Now;
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
return DateTime.Now;
}
}
另一个编辑:
这也有效
DateTimeOffset dto;
bool bIsParsed = DateTimeOffset.TryParseExact(dateTimeFormatted.Trim(), "yyyy-MM-ddTHH:mm:sszzz",
System.Globalization.CultureInfo.InvariantCulture,
DateTimeStyles.AdjustToUniversal, out dto);
if (bIsParsed)
return dto.DateTime;
答案 0 :(得分:2)
尝试在格式字符串中的特定字符周围添加引号:
DateTime myDate = DateTime.ParseExact(dateTimeFormatted,
"yyyy'-'MM'-'dd'T'HH':'mm':'sszzz", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None);
答案 1 :(得分:1)
您的代码不会抛出FormatException
。但我希望它可以......
首先,不要在DateTime
解析时使用"zzz"
custom format specifier。不建议这样做。由于DateTime
不存储任何 UTC Offset值,因此没有必要使用它。
来自文档;
使用DateTime值," zzz"自定义格式说明符代表 签署本地操作系统时区与UTC的偏移量, 以小时和分钟计。它没有反映出一个人的价值 instance的DateTime.Kind属性。出于这个原因," zzz"格式 建议不要将说明符与DateTime值一起使用。
如果你的字符串有偏移部分,最好将其解析为DateTimeOffset
而不是DateTime
。
由于您使用DateTimeStyles.None
,因此会将您的字符串解析为Local
时间。这意味着它会将您当前的时区偏移值添加到结果中。
例如,我住在Turkey,现在时区是UTC +02:00
。这就是为什么如果我像你一样使用DateTimeStyles.None
,结果的时间部分将是22:49:24
而不是20:49:24
。
如果我使用DateTimeStyles.AdjustToUniversal
,则会20:49:24
。
这里有DateTimeOffset
解析;
string s = "2014-11-10T14:49:24-06:00";
DateTimeOffset dto;
if(DateTimeOffset.TryParseExact(s, "yyyy-MM-ddTHH:mm:sszzz",
CultureInfo.InvariantCulture,
DateTimeStyles.AdjustToUniversal, out dto))
{
Console.WriteLine(dto.DateTime) // 10/11/2014 20:49:24
}