オーバーフローのあるDateTime.Parse
Aug 18 2020
このようなオーバーフローした日付または月を受け入れるDateTime.Parseの代替手段はありますか?
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);
}
}
}
このコードSystem.FormatException
は、DateTime.Parse
行になります。
文字列が有効な日時として認識されませんでした
オーバーフローを許可する文字列を解析して、次のように扱うことはでき"2020-02-01"
ますか?
これは他の言語/実装では標準のようです。
回答
1 GarrisonBecker Aug 18 2020 at 18:35
自分で転がさずにこれを行う方法がわかりません。日時の形式がわかっている場合は、次の操作などを行うことができます。
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);
}
これは、ここで提供されている夏時間の影響を受けません。
ローカルの日付と時刻の値に対する算術演算または比較演算では、特定の値があいまいであるか無効であるかは考慮されません。また、ローカルタイムゾーンの夏時間への移行または夏時間からの移行に起因する調整ルールの影響も考慮されません。