datetime.tryparse不能解析dateTime.minvalue



我正在使用一个名为json.net的库,该库在内部使用以下代码将JSON字符串解析为DateTime:

if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt))
{
     dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling);
     SetToken(JsonToken.Date, dt);
     return dt;
}

我以为json.net正在搞砸转换,但是看起来是dateTime。

当我解析以下有效的ISO日期(对应于UTC DateTime.minvalue)时:

string json = "0001-01-01T00:00:00+00:00";
DateTime dt;
DateTime.TryParse(json, invariantCulture, DateTimeStyles.RoundtripKind, out dt);

结果是局部dateTime: {0001-01-01 8:00:00 PM},当将其转换回UTC时间时,会给{0001-01-02 0:00:00 PM}。从本质上讲,日期下载的日期,这正是您期望dateTimestyles.Roundtripkind避免的问题。

如何避免这种情况?

为什么要使用dateTimestyles.RoundTripkind?Roundtripkind的文档说:

使用" O"或" R"标准格式指定器将DateTime对象转换为字符串时,将保留日期的DateTimeKind字段,然后将字符串转换回DateTime对象。

" O"或" R"标准格式指定器的字符串输出不像您要解析的ISO 8601字符串。在我看来,这听起来不像Roundtripkind确实应该使用任何日期时间字符串格式。听起来往返是用于datetime.kind属性时的字符串时属性的。

由于您知道要解析的字符串的格式,因此我建议使用dateTime.tryparseexact。

我不得不支持ISO 8601字符串的几个不同版本 - 这些格式中的任何一种是ISO 8601中的有效日期值值(而且还有更多的日期,时间和分数秒的选项,但我没有't):

0001-01-01T00:00:00 00:00

0001-01-01T00:00:00z

这是一种可以处理以下两种格式的方法:

private bool TryParseIso8601(string s, out DateTime result)
{
    if (!string.IsNullOrEmpty(s))
    {
        string format = s.EndsWith("Z") ? "yyyy-MM-ddTHH:mm:ssZ" : "yyyy-MM-ddTHH:mm:sszzz";
        return DateTime.TryParseExact(s, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out result);
    }
    result = new DateTime(0L, DateTimeKind.Utc);
    return false;
}

相关内容

  • 没有找到相关文章

最新更新