库在C#中使用日期表达式?

时间:2010-04-29 15:47:16

标签: c# jodatime

我可以使用哪个库来根据日期表达式计算日期?

日期表达式类似于:

  • “+ 3D”(加上三天)
  • “ -​​ 1W”(减去一周)
  • “ -​​ 2Y + 2D + 1M”(减去2年,再加上一天,再加上一个月)

示例:

DateTime EstimatedArrivalDate = CalcDate("+3D", DateTime.Now);

预计到达日期等于当前日期加3天。

我听说过JodaTime和NodaTime,但我还没有看到任何内容,但是我没有看到。 我应该使用什么来在C#中获得此功能?

2 个答案:

答案 0 :(得分:4)

没有库(我知道,包括JodaTime到.NET的端口)可以使用这样的表达式。只要表达式被简单地链接(就像你的例子中那样),编写一个RegEx就可以很容易地解析该表达式并自己进行处理:

public static DateTime CalcDate(string expression, DateTime epoch)
{
    var match = System.Text.RegularExpressions.Regex.Match(expression, 
                    @"(([+-])(\d+)([YDM]))+");

    if (match.Success && match.Groups.Count >= 5)
    {
        var signs = match.Groups[2];
        var counts = match.Groups[3];
        var units = match.Groups[4];

        for (int i = 0; i < signs.Captures.Count; i++)
        {
            string sign = signs.Captures[i].Value;
            int count = int.Parse(counts.Captures[i].Value);
            string unit = units.Captures[i].Value;

            if (sign == "-") count *= -1;

            switch (unit)
            {
                case "Y": epoch = epoch.AddYears(count); break;
                case "M": epoch = epoch.AddMonths(count); break;
                case "D": epoch = epoch.AddDays(count); break;
            }
        }
    }
    else
    {
        throw new FormatException(
            "The specified expression was not a valid date expression.");
    }

    return epoch;
}

答案 1 :(得分:2)

您可以使用DateTime和TimeSpan的组合来完成所有这些操作。你可以在http://dotnetperls.com/timespan

找到一些很好的例子

来自您的示例:DateTime EstimatedArrivalDate = DateTime.Now.AddDays(3);