【问题标题】:Calculating past datetime in C#在 C# 中计算过去的日期时间
【发布时间】:2010-03-01 20:58:16
【问题描述】:

我正在研究 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 天,那将是非常不准确的。

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

谢谢!

【问题讨论】:

  • 对如何实现它有任何想法吗?因为到目前为止,您的技术看起来像:“问 SO,也许有人会为我做”。告诉我们您已经尝试过什么!

标签: c# datetime timespan


【解决方案1】:

DateTime 具有 AddMonthsAddDaysAddYears 方法。用减号来减法

【讨论】:

  • 出于某种非常糟糕的原因,我认为我需要使用 SubtractDays 等方法来做到这一点。事实证明,添加底片具有相同的效果。我可能要重修一门基础代数课程...... TY!!!
【解决方案2】:

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

来自DateTime.AddDays Method

值参数可以是负数或 积极的。

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

【讨论】:

    【解决方案3】:

    为了减去月份,我创建了一个新的 DateTime 并只计算月份/年份。所以 1/2010 - 6 个月将是 6/2010...一旦确定了月份/年份,您就可以查看原始的日期时间部分,并确保它适合该月份。

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

    【讨论】:

      【解决方案4】:

      请记住,您也可以添加负数并查看 this methodthis one

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-13
          • 1970-01-01
          • 2011-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多