【问题标题】:C# : Based on a start date and number of Months/Fortnights, calculate the appropriate datesC#:根据开始日期和月/两周数,计算适当的日期
【发布时间】:2021-01-07 09:45:14
【问题描述】:

我有一个给定开始日期和结束日期之间的日期列表,这些日期可以是月底日期或每个月的 15 日。我想过滤掉所有从 15 日开始的日期。有没有办法在 C# 中实现这一点?

我正在考虑将数据集中的所有日期转换为字符串并遍历列表并运行正则表达式(我需要帮助),这将从列表中删除以 15 开头的日期。有没有更好的方法来解决这个问题?

【问题讨论】:

  • 使用DateTime 对象,而不是字符串。
  • 你应该展示你已经尝试过的代码,所以我们可以帮助你尝试。要求解决一般问题被认为是粗鲁的。这不是代码编写服务。这是一个帮助论坛。这就是您的问题被否决的原因。
  • dates.Where(d => d.Day != 15)
  • @JohnathanBarclay 不要忘记 .ToList() dates = dates.Where(d => d.Day != 15).ToList();
  • @MathewHD 感谢您的帮助。解决方案非常简单,以至于我问了这个问题实际上看起来很愚蠢。然而,在我的辩护中,我确信将日期转换为字符串然后应用正则表达式是可行的方法,所以我什至没有考虑其他更简单的可能性。非常感谢您的帮助。

标签: c# .net regex linq logic


【解决方案1】:

对于措辞不当的问题,我们深表歉意。这就是我们想要做的。 给定开始日期,我们有一个下拉菜单来选择是否要基于每月/每两周计算上一个日期。每月日期必须是月末日期,而每两周一次的日期必须是 15 日。下面是计算这个的代码。

参数: dtAsOnDate 是开始日期 间隔是每月/每两周一次 numberOfIntervals 是我们需要返回的月数/两周数。

例如,如果我选择 2020 年 3 月 31 日作为开始日期,每两周一次作为我的间隔,3 作为我的间隔数,代码现在返回 2020 年 2 月 15 日(3 月 31 日之前的 4 个两周,3 月 31 日是第一个两周)

public static List<string> GetDate(DateTime dtAsOnDate, string interval, int numberOfIntervals)
        {
            DateTime currDate = dtAsOnDate;
            DateTime startDate = currDate.AddMonths(-numberOfIntervals);
            DateTime endDate = currDate;
            Func<DateTime, bool> condition = null;
            if (interval == "Monthly")
            {
                if (dtAsOnDate.Day == 15)
                    condition = date => date.Day == 15;
                else
                    condition = date => date.Day == DateTime.DaysInMonth(date.Year, date.Month);
            }
            else
            {
                condition = date => date.Day == 15 || date.Day == DateTime.DaysInMonth(date.Year, date.Month);
            }
            return Enumerable.Range(0, (endDate - startDate).Days + 1)
                     .Select(index => startDate.AddDays(index))
                     .Where(condition)
                     .TakeWhile(date => date <= endDate)
                     .OrderByDescending(date => date)
                     .Take(numberOfIntervals)
                     .Select(date => date.ToString("dd-MMM-yyyy"))
                     .ToList();

        }

【讨论】:

    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    相关资源
    最近更新 更多