DateTime.Parse com estouro
Existe uma alternativa para DateTime.Parse que aceitará uma data ou mês excedente 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 resulta em um System.FormatException
na DateTime.Parse
linha.
String não foi reconhecida como um DateTime válido
Posso analisar a string permitindo o estouro para que seja tratada como "2020-02-01"
?
Isso parece ser padrão em outras linguagens / implementações.
Respostas
Não sei como você poderia fazer isso sem rolar o seu próprio. Se você conhece o formato dos seus datetimes, pode fazer o seguinte ou algo semelhante.
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);
}
Isso não é afetado pelo horário de verão, obtido aqui .
As operações aritméticas ou de comparação em valores de data e hora locais não consideram se um valor específico é ambíguo ou inválido, nem levam em consideração o efeito de quaisquer regras de ajuste que resultam da transição do fuso horário local para ou do horário de verão.