6

我正在研究 C# 中的一种算法,以根据具有以下特征的输入字符串计算过去的 DateTime:

该字符串包含一个整数,后跟“D”、“M”或“Y”,例如“1D”或“90M”。

输出将为 DateTime.Now 减去相应的天数、月数或年数。

我遇到的问题是,例如,如果我在正则表达式(D、M 或 Y)上切换输入字符串并从 DateTime.Now 中减去相应的 TimeSpan,则新的 TimeSpan() 构造函数不接受月或年,只有几天。

if (new Regex(@"[0-9]+D").IsMatch(value))
{
    newDate = DateTime.Now - TimeSpan(Int32.Parse(value.Replace("D", "")), 0, 0);
}

如果输入字符串以天为单位,则此逻辑很好,但 TimeSpan 的构造函数不接受月或年,如果我假设每个月有 30 天,或者每年有 365 天,那将是非常不准确的。

有人对如何实现这个算法有想法吗?

谢谢!

4

5 回答 5

15

DateTimeAddMonths,AddDaysAddYears方法。将它们与减号一起使用

于 2010-03-01T21:02:59.920 回答
3

您能不能尝试使用AddDays/AddMonths/AddYears但使用负数?

来自DateTime.AddDays 方法

value 参数可以是负数或正数。

然后也许只是实现一个 switch 语句来应用适当的 Add 方法。

于 2010-03-01T21:03:29.840 回答
0

为了减去月份,我创建了一个新的 DateTime 并只评估月份/年份。所以 1/2010 - 6 个月将是 6/2010 ......一旦你确定了月份/年份,你可以查看原始的日期时间天组件,并确保它适合当月。

这就是我所做的。年份的评估方式相同。减去天数很容易;使用 TimeSpan 组件来做到这一点。

于 2010-03-01T21:02:06.157 回答
0

请记住,您也可以添加负数并查看此方法方法。

于 2010-03-01T21:04:06.983 回答
0

http://msdn.microsoft.com/en-us/library/3z48198e.aspx TimeSpan.TryParse 接受非常接近您的字符串,只要您可以适应其格式或从您的格式转换为它的格式。

于 2010-03-01T21:10:07.440 回答