计算从给定日期开始的周数周?

Big*_*ile 8 .net c# datetime date

我正在努力寻找一种简单而有效的解决方案来计算一个月的工作日.例如,如果给定日期是第一个星期一Monday 5th March 2018之后我想了一个月的每个第一个星期一的日期为未来6个月例如:Monday 2nd April 2018Monday 3rd May 2018等.

我试图使用此问题中的以下代码.但是,下面的代码只返回我希望它返回整个日期的周数.

static class DateTimeExtensions
{
    static GregorianCalendar _gc = new GregorianCalendar();
    public static int GetWeekOfMonth(this DateTime time)
    {
        DateTime first = new DateTime(time.Year, time.Month, 1);
        return time.GetWeekOfYear() - first.GetWeekOfYear() + 1;
    }

    static int GetWeekOfYear(this DateTime time)
    {
        return _gc.GetWeekOfYear(time, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我很困惑,不知道如何修改上面的代码来解决这个问题.任何帮助将不胜感激.

Kun*_*jee 6

最近微软在 GitHub 上发布了一个DateTimeRecognizer 项目, 它允许你将自然语言日期时间解析为普通的旧 C# DateTime 对象。它已经过彻底测试,所以没有猴子在那里工作。

他们还发布了相同的 nuget 包。您可以通过 nuget 包管理器安装它。


首先安装nuget包:

Microsoft 日期识别器 Nuget 包


同时,所有这一切都没有办法。我开发了一个小实用程序,它首先从自然语言中提取日期时间,然后找到下个月同一天的后续日期的第一次出现。

using Microsoft.Recognizers.Text;
using Microsoft.Recognizers.Text.DateTime;
using System;
using System.Collections.Generic;
using System.Linq;

namespace RecognizerDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string Query = string.Empty;
                Console.WriteLine("Enter date: ");
                Query = Console.ReadLine();
                DateTime parsedDate = ExtractDateFromNaturalLanguage(Query);
                List<DateTime> futureDates = GetSubsequentDateTimes(parsedDate);


                foreach (var item in futureDates)
                {
                    Console.WriteLine(item.ToLongDateString());
                }

            }
            catch(Exception ex)
            {
                Console.WriteLine($"Failed because: {ex.Message}");
            }
        }

    static List<DateTime> GetSubsequentDateTimes(DateTime date)
    {
        try
        {
            List<DateTime> futureDates = new List<DateTime>();
            DayOfWeek dayOfWeekOriginalDate = date.DayOfWeek;
            int month = date.Month;

            futureDates.Add(date);

            for (int i = month + 1; i <= month + 5; i++)
            {
                DateTime dt = new DateTime(date.Year, i, 1);

                while (dt.DayOfWeek != dayOfWeekOriginalDate)
                {
                    dt = dt.AddDays(1);
                }
                futureDates.Add(dt);
            }

            return futureDates;
        }
        catch(Exception ex)
        {
            throw;
        }
    }

        static DateTime ExtractDateFromNaturalLanguage(string Query)
        {
            try
            {
                DateTimeModel model = DateTimeRecognizer.GetInstance().GetDateTimeModel(Culture.English);
                List<ModelResult> parsedResults = model.Parse(Query);

                Dictionary<string, string> resolvedValue = (parsedResults.SelectMany(x => x.Resolution).FirstOrDefault().Value as List<Dictionary<string, string>>).FirstOrDefault();

                string parsedDate = string.Empty;

                if (resolvedValue["type"] == "daterange")
                    parsedDate = resolvedValue["start"];

                if (resolvedValue["type"] == "date")
                    parsedDate = resolvedValue["value"];

                DateTime parsedDateTimeObject = DateTime.Parse(parsedDate);

                return parsedDateTimeObject;
            }
            catch (Exception ex)
            {
                throw;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这,就是你所需要的。

这是你需要的


Sal*_*n A 4

只需在输入日期中添加 4 周,如有必要,还可添加 7 天:

static DateTime GetNextDate(DateTime d1)
{
    System.Diagnostics.Debug.Assert(d1.Day <= 28, "Behavior not described");
    DateTime d2 = d1.AddDays(28);
    // the following evaluates to 1 for 1-7, 2 for 8-14, etc
    int n1 = (d1.Day - 1) / 7 + 1;
    int n2 = (d2.Day - 1) / 7 + 1;
    if (n2 != n1)
    {
        d2 = d2.AddDays(7);
    }
    return d2;
}
Run Code Online (Sandbox Code Playgroud)

输入和输出示例:

static DateTime GetNextDate(DateTime d1)
{
    System.Diagnostics.Debug.Assert(d1.Day <= 28, "Behavior not described");
    DateTime d2 = d1.AddDays(28);
    // the following evaluates to 1 for 1-7, 2 for 8-14, etc
    int n1 = (d1.Day - 1) / 7 + 1;
    int n2 = (d2.Day - 1) / 7 + 1;
    if (n2 != n1)
    {
        d2 = d2.AddDays(7);
    }
    return d2;
}
Run Code Online (Sandbox Code Playgroud)