web-dev-qa-db-fra.com

Débordement de DateTime dans .NET

Nous avons un back-end Scala/Java qui génère l'équivalent de DateTime.MaxValue en .NET. 

Je reçois la date suivante sous forme de chaîne "9999-12-31T23: 59: 59.999999999Z".

Si j'ai utilisé DateTime.TryParse("9999-12-31T23:59:59.999999999Z", out var dateTime), il renvoie alors une ArgumentOutOfRangeException (la valeur ajoutée ou soustraite donne un nom DateTime.Parameter non représentable: valeur).

Je ne m'y attendais pas, puisque j'appelais Try Parse. Peut-être que retourner faux aurait été plus intuitif?

Si je réduis l'année, je peux voir que .NET reporte la date au lendemain, ce qui ne fonctionnera évidemment pas avec une date/heure maximum!

DateTime.TryParse("9998-12-31T23:59:59.999999999Z", out var dateTime);
dateTime.ToString().Dump();

Sorties: 01/01/9999 00:00:00

Si je réduis la précision de ms de 2, alors cela fonctionne:

DateTime.TryParse("9998-12-31T23:59:59.9999999Z", out var dateTime);
dateTime.ToString().Dump();

Sorties: 31/12/9998 23:59:59

Cela ressemble vraiment à un bogue dans .NET? Est-ce comportement attendu?

12
David Kiff

Vous avez trop de neuf dans votre chaîne. L'exception que vous observez est la question de la précision.

Essayez de faire ce qui suit:

DateTime.MaxValue.ToString("o")

Utilisez "9999-12-31T23:59:59.9999999Z" comme entrée et l'analyse se déroulera avec succès dans DateTime.MaxValue.

PS: TryParse convertira également cette valeur dans votre fuseau horaire local, ce qui, je suppose, n’est pas ce que vous anticiperiez. Utilisez la version étendue à la place:

DateTime.TryParse("9999-12-31T23:59:59.9999999Z", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTime);
1
user6674679