当前位置: 首页 > 知识库问答 >
问题:

计算从给定日期算起的周数?

崔高远
2023-03-14

我正在努力寻找一个简单而有效的解决方案来计算一个月中的一周和一天。例如,如果给定的日期是2018年3月5日的第一个星期一,那么我想得到接下来6个月每个月的第一个星期一的日期,例如:2018年4月2日星期一和2018年5月3日星期一等等。

我试着从这个问题中使用以下代码。然而,下面的代码只返回我希望它返回整个日期的周数。

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);
    }
}

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

共有3个答案

姚凯歌
2023-03-14

有了Crontab和一些聪明的linq,你不仅可以得到任何月份的第一天,还可以得到任何你需要的日期组合,只需不到10行代码:

首先,通过NuGet安装ncontab:install Package ncontab-Version 3.3.0

其次,以星期一为例,创建所有月份只返回星期一的crontab表达式(上面的链接将很有用):

var schedule = CrontabSchedule.Parse("0 0 * * 1");

上面写着:“零分钟,零小时(即午夜),任何一天,任何一个月,周一”

该时间表为您提供了一个函数,您可以调用该函数来获取任何时段的周一。

最后,对于聪明的linq:我们想按月对星期一进行分组,然后选择每个月的第一个。它看起来像这样:

var mondays = schedule
    // the occurrences in the date range we want
    .GetNextOccurrences(new DateTime(2018, 3, 1), new DateTime(2018, 9, 30))
    .ToLookup(
        date => (date.Year * 100) + date.Month, // The 'key' becomes a "period". i.e. yyyyMM
        date => date) // this is our grouping by month
    .Select(d => d.First()) // Take the first instance per group
    .ToList(); // you now have 6 Mondays!

可以使用d. ElementAtOrDefault(n)轻松调整选择以查找当月的第一个、第二个...星期。如果您想要最后一个月,d. last()

皇甫飞飙
2023-03-14

只需添加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;
}

示例输入和输出:

Thu 2018-Mar-01 > Thu 2018-Apr-05
Fri 2018-Mar-02 > Fri 2018-Apr-06
Sat 2018-Mar-03 > Sat 2018-Apr-07
Sun 2018-Mar-04 > Sun 2018-Apr-01
Mon 2018-Mar-05 > Mon 2018-Apr-02
Tue 2018-Mar-06 > Tue 2018-Apr-03
Wed 2018-Mar-07 > Wed 2018-Apr-04
Thu 2018-Mar-08 > Thu 2018-Apr-12
Fri 2018-Mar-09 > Fri 2018-Apr-13
Sat 2018-Mar-10 > Sat 2018-Apr-14
Sun 2018-Mar-11 > Sun 2018-Apr-08
Mon 2018-Mar-12 > Mon 2018-Apr-09
Tue 2018-Mar-13 > Tue 2018-Apr-10
Wed 2018-Mar-14 > Wed 2018-Apr-11
Thu 2018-Mar-15 > Thu 2018-Apr-19
Fri 2018-Mar-16 > Fri 2018-Apr-20
Sat 2018-Mar-17 > Sat 2018-Apr-21
Sun 2018-Mar-18 > Sun 2018-Apr-15
Mon 2018-Mar-19 > Mon 2018-Apr-16
Tue 2018-Mar-20 > Tue 2018-Apr-17
Wed 2018-Mar-21 > Wed 2018-Apr-18
Thu 2018-Mar-22 > Thu 2018-Apr-26
Fri 2018-Mar-23 > Fri 2018-Apr-27
Sat 2018-Mar-24 > Sat 2018-Apr-28
Sun 2018-Mar-25 > Sun 2018-Apr-22
Mon 2018-Mar-26 > Mon 2018-Apr-23
Tue 2018-Mar-27 > Tue 2018-Apr-24
Wed 2018-Mar-28 > Wed 2018-Apr-25
秦才英
2023-03-14

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

他们还发布了同样的nuget软件包。可以通过nuget软件包管理器安装。

首先安装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;
            }
        }
    }
}

这就是你需要的。

 类似资料:
  • 问题内容: 给定一个星期数,例如,您如何计算从星期一开始的那一周中的天数? 第40周的rfc-3339输出示例: 问题答案: PHP 下面的帖子是因为我是个白痴,没有正确阅读问题,但是会获得从星期一开始的一周中的日期,给出的是日期,而不是星期数。 在PHP中 ,改编自PHP日期手册页上的这篇文章 来自的输出:

  • 问题内容: 我在Spring 3.0项目中使用Joda time api计算日期。现在我有一个开始日期和结束日期,我想在这两个日期之间得到每天的周末,星期六或星期日。我该如何实现? 我看了这篇Joda的时间-两个日期之间的所有星期一。它提供了一些指导,但在如何排除两个日期方面仍然含糊。 问题答案: 我想你的问题是如何 在两个日期之间的周末,星期六或星期日除外的每一天获取。 解决方案 :

  • 问题内容: 我需要从MySQL选择语句中的某个日期算起几周。其中一个表中有一个日期列,我需要计算该日期有几周。 例子: 6 days away, weeks out = 0 7 days away, weeks out = 1 13 days away, weeks out = 1 14 days away, weeks out = 2 问题答案: 使用DATEDIFF函数: WEEKS的问题在于

  • 问题内容: 我想获得任何一年中的周数。即使被接受为全球通用的答案,对于日历,而实际上有几个星期。 有什么方法可以计算出来,或者有什么函数可以帮助我? 问题答案: 根据维基百科关于ISO周日期格式的文章,您可以使用以下代码进行计算。 更新: 似乎来自@Samuel的答案更好,并且没有Luca提到的错误 快速一线:

  • 本文向大家介绍php计算给定日期所在周的开始日期和结束日期示例,包括了php计算给定日期所在周的开始日期和结束日期示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php计算给定日期所在周的开始日期和结束日期。分享给大家供大家参考,具体如下: 运行结果如下: PS:这里再为大家推荐几款时间及日期相关工具供大家参考使用: 在线日期/天数计算器: http://tools.jb51.net/

  • 问题内容: 我如何知道JavaScript的周数和年份来计算日期?对于第20周和2013年以获得5/16/2013,我正在尝试这样做: 问题答案: function getDateOfWeek(w, y) { var d = (1 + (w - 1) * 7); // 1st of January + 7 days for each week 这使用简单的周定义,即2013年的第20周是5月14日