DateTime.Parse z przepełnieniem
Czy istnieje alternatywa dla DateTime.Parse, która zaakceptuje przepełnioną datę lub miesiąc taki jak ten?
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);
}
}
}
Kod ten wynika w sposób System.FormatExceptionna DateTime.Parselinii.
Ciąg nie został rozpoznany jako prawidłowy DateTime
Czy mogę przeanalizować ciąg zezwalający na przepełnienie, aby był traktowany jako "2020-02-01"?
Wydaje się, że jest to standard w innych językach / implementacjach.
Odpowiedzi
Nie wiem, jak mógłbyś to zrobić bez skręcania własnego. Jeśli znasz format swoich dat, możesz wykonać następujące czynności lub coś podobnego.
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);
}
Nie ma na to wpływu czas letni pochodzący z tego miejsca .
Operacje arytmetyczne lub porównania dotyczące lokalnych wartości daty i godziny nie uwzględniają, czy dana wartość jest niejednoznaczna lub nieprawidłowa, ani nie uwzględniają skutków jakichkolwiek reguł korekty, które wynikają z przejścia lokalnej strefy czasowej na lub z czasu letniego.