这个DateTime字符串有什么问题?

时间:2014-11-12 14:32:15

标签: c# string datetime

此字符串由我尝试调试的应用程序生成。 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;

2 个答案:

答案 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
}