DateTime.Parse con desbordamiento
¿Existe una alternativa a DateTime.Parse que acepte una fecha o mes desbordado como este?
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Tests
{
[TestClass]
public class DateTimeTest
{
[TestMethod]
public void TestOverflowOfDay()
{
var dt = DateTime.Parse("2020-01-32");
var str = dt.ToString();
Assert.AreEqual("2020-02-01 00:00:00", str);
}
}
}
Este código da como resultado un System.FormatException
en la DateTime.Parse
línea.
La cadena no se reconoció como una fecha y hora válida
¿Puedo analizar la cadena que permite el desbordamiento para que se trate como "2020-02-01"
?
Eso parece ser estándar en otros lenguajes / implementaciones.
Respuestas
No sé cómo podrías hacer esto sin tirar el tuyo. Si conoce el formato de sus fechas y horas, puede hacer lo siguiente o algo similar.
static void Main(string[] args)
{
var date = GetCustomDateTime("2020-01-32");
Console.WriteLine(date.ToString("yyyy-MM-dd HH:mm:ss"));
}
private static DateTime GetCustomDateTime(string dateTimeString)
{
var split = dateTimeString.Split('-');
var yearMonth = DateTime.ParseExact($"{split[0]}-{split[1]}", "yyyy-MM", CultureInfo.InvariantCulture);
return yearMonth.AddDays(int.Parse(split[2])-1);
}
Esto no se ve afectado por el horario de verano, obtenido aquí .
Las operaciones aritméticas o de comparación en valores de fecha y hora locales no tienen en cuenta si un valor particular es ambiguo o no válido, ni tienen en cuenta el efecto de las reglas de ajuste que resultan de la transición de la zona horaria local hacia o desde el horario de verano.