DateTime.Parse dengan overflow
Apakah ada alternatif untuk DateTime.Parse yang akan menerima tanggal atau bulan yang melimpah seperti ini?
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);
}
}
}
Kode ini menghasilkan sebuah System.FormatException
on the DateTime.Parse
line.
String tidak dikenali sebagai DateTime yang valid
Dapatkah saya mengurai string yang memungkinkan overflow sehingga akan diperlakukan sebagai "2020-02-01"
?
Itu tampaknya menjadi standar dalam bahasa / implementasi lain.
Jawaban
Saya tidak tahu bagaimana Anda bisa melakukan ini tanpa menggulung sendiri. Jika Anda mengetahui format waktu data Anda, Anda dapat melakukan hal berikut, atau yang serupa.
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);
}
Ini tidak terpengaruh oleh waktu musim panas, bersumber di sini .
Operasi aritmatika atau perbandingan pada nilai tanggal dan waktu lokal tidak mempertimbangkan apakah nilai tertentu ambigu atau tidak valid, juga tidak memperhitungkan pengaruh aturan penyesuaian yang dihasilkan dari transisi zona waktu lokal ke atau dari waktu musim panas.