JamesNK/Newtonsoft.Json · error · ArgumentException
Can not convert to DateTimeOffset.
Error message
Can not convert {0} to DateTimeOffset. What it means
Thrown by the explicit (non-nullable) cast operator DateTimeOffset(JToken) at JToken.cs:588. It validates the token type against DateTimeTypes = {Date, String, Comment, Raw}. Only date-carrying or string JValues are accepted; numbers, booleans, null, and containers are rejected with this ArgumentException. (A string value is later parsed via DateTimeOffset.Parse, so only the type gate, not parse failures, produces this specific message.)
Solutions
- Use the nullable cast (DateTimeOffset?)token and null-coalesce, so a JSON null yields null rather than throwing.
- If the value is a numeric epoch, convert manually: DateTimeOffset.FromUnixTimeSeconds((long)token) — but first cast via long, not DateTimeOffset.
- Ensure the JSON value is an ISO-8601 string so its JTokenType is String (accepted by DateTimeTypes).
- Check token.Type is Date or String before the non-nullable cast.
Example fix
// before
DateTimeOffset dto = (DateTimeOffset)token["ts"]; // throws for numeric/null epoch
// after
DateTimeOffset dto = token["ts"].Type == JTokenType.Integer
? DateTimeOffset.FromUnixTimeSeconds((long)token["ts"])
: (DateTimeOffset?)token["ts"] ?? DateTimeOffset.MinValue; Defensive patterns
Strategy: type-guard
Validate before calling
// Verify the token is a date-or-string scalar before the non-nullable DateTimeOffset cast
static bool CanToDateTimeOffset(JToken? t) =>
t is JValue v && (v.Type == JTokenType.Date || v.Type == JTokenType.String); Type guard
static DateTimeOffset? SafeDateTimeOffset(JToken? t) => t switch {
JValue v when v.Type is JTokenType.Date or JTokenType.String => (DateTimeOffset?)t,
JValue v when v.Type is JTokenType.Null or JTokenType.Undefined => null,
_ => null
}; Try / catch
try
{
DateTimeOffset dto = (DateTimeOffset)token;
}
catch (ArgumentException ex) when (ex.Message.StartsWith("Can not convert"))
{
// token is numeric/null/object; handle epoch conversion or default
} Prevention
- Use (DateTimeOffset?)token for fields that may be JSON null.
- Confirm the JSON value is an ISO-8601 string or Date, not a numeric epoch.
- Convert epoch integers explicitly via DateTimeOffset.FromUnixTimeSeconds rather than the DateTimeOffset cast.
- Check token.Type is Date or String before the non-nullable cast.
When it happens
Trigger: Casting a JSON null to (DateTimeOffset)token; casting an Integer (e.g. a unix epoch) or Float JValue to DateTimeOffset; casting a Boolean, Guid, Uri, or a JObject/JArray to DateTimeOffset.
Common situations: API returns a numeric epoch timestamp but code assumes an ISO-8601 string; field became null after a schema/version change; a date field represented as an object (e.g. {"$date": ...}) instead of a string.
Related errors
- Can not convert to Boolean.
- Can not convert to Byte.
- Can not convert to Char.
- Can not convert to DateTime.
- Can not convert to Decimal.
AI-assisted analysis of JamesNK/Newtonsoft.Json@4f73e74372 (2026-08-07).
Data as JSON: /api/errors/e5b2887f1addf14b.
Report an issue: GitHub.
Appendix: source
Thrown at Src/Newtonsoft.Json/Linq/JToken.cs:588
return Convert.ToBoolean((int)integer);
}
#endif
return Convert.ToBoolean(v.Value, CultureInfo.InvariantCulture);
}
#if HAVE_DATE_TIME_OFFSET
/// <summary>
/// Performs an explicit conversion from <see cref="Newtonsoft.Json.Linq.JToken"/> to <see cref="System.DateTimeOffset"/>.
/// </summary>
/// <param name="value">The value.</param>
/// <returns>The result of the conversion.</returns>
public static explicit operator DateTimeOffset(JToken value)
{
JValue? v = EnsureValue(value);
if (v == null || !ValidateToken(v, DateTimeTypes, false))
{
throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
}
if (v.Value is DateTimeOffset offset)
{
return offset;
}
if (v.Value is string s)
{
return DateTimeOffset.Parse(s, CultureInfo.InvariantCulture);
}
return new DateTimeOffset(Convert.ToDateTime(v.Value, CultureInfo.InvariantCulture));
}
#endif
/// <summary>
/// Performs an explicit conversion from <see cref="JToken"/> to <see cref="Nullable{T}"/> of <see cref="Boolean"/>.View on GitHub (pinned to 4f73e74372)