Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从c#中的年数和周数中获取月数?_C#_Datetime - Fatal编程技术网

如何从c#中的年数和周数中获取月数?

如何从c#中的年数和周数中获取月数?,c#,datetime,C#,Datetime,正如标题所说,给定年份和周数,如何获得月数 编辑:如果一周跨越两个月,我想要一周中第一天所在的月份 编辑(2):这是我获取周数的方式: CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Monday); 我只是想做相反的事情。这不也取决于一周中的哪一天吗?你不能。你至少需要第一周开始的那一天(或这一周开始的时间),才能得到准确的答案。你做不到。

正如标题所说,给定年份和周数,如何获得月数

编辑:如果一周跨越两个月,我想要一周中第一天所在的月份

编辑(2):这是我获取周数的方式:

CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Monday);

我只是想做相反的事情。

这不也取决于一周中的哪一天吗?

你不能。你至少需要第一周开始的那一天(或这一周开始的时间),才能得到准确的答案。

你做不到。一周可能从一个月开始,到另一个月结束

我想你是假设“一周”是连续7天的任意一组。事实并非如此。考虑到2008年的第5周,你可能在1月或2月,这取决于你的“周”开始的时间。

你可能面临的另一个问题是,大多数年份不是从一周的开始开始开始的,这会改变一切。

如果你假设你对周的定义的第一天与一年中的第一天是同一天,那么这就行了:

int year = 2000;
int week = 9;
int month = new DateTime(year, 1, 1).AddDays(7 * (week - 1)).Month;

显然,一个真正的答案取决于你如何定义一周的第一天,以及如何定义一周与一个月重叠时的月份。

这就是我最后做的:

static int GetMonth(int Year, int Week)
{
    DateTime tDt = new DateTime(Year, 1, 1);

    tDt.AddDays((Week - 1) * 7);

    for (int i = 0; i <= 365; ++i)
    {
        int tWeek = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
            tDt, 
            CalendarWeekRule.FirstDay, 
            DayOfWeek.Monday);
        if (tWeek == Week)
            return tDt.Month;

        tDt = tDt.AddDays(1);
    }
    return 0;
}
static int GetMonth(int年,int周)
{
DateTime tDt=新的日期时间(年,1,1);
tDt.增加天数((第1周)*7天);

对于(inti=0;i这应该能够有所帮助

 public int getMonth(int weekNum, int year)
 {
     DateTime Current = new DateTime(year, 1, 1);
     System.DayOfWeek StartDOW = Current.DayOfWeek;
     int DayOfYear = (weekNum * 7) - 6; //1st day of the week

     if (StartDOW != System.DayOfWeek.Sunday) //means that last week of last year's month
     {
         Current = Current.AddDays(7 - (int)Current.DayOfWeek);
     }
     return Current.AddDays(DayOfYear).Month;
}
假设:

  • 星期天是一周的第一天
  • 部分周仍将计为第1周
  • 以整数数组的形式输出开始月份和结束月份

    public int[] getMonth(int weekNum, int year)
    {
    
        DateTime StartYear = new DateTime(year, 1, 1);
        System.DayOfWeek StartDOW = StartYear.DayOfWeek;
        DateTime DayOfYearWeekStart = default(DateTime);
        DateTime DayOfYearWeekEnd = default(DateTime);
        int x = 0;
        if ((StartDOW == System.DayOfWeek.Sunday)) {
            DayOfYearWeekStart = StartYear.AddDays((weekNum - 1) * 7);
            DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6);
        } else {
            for (x = 0; x <= 7; x += 1) {
                if (StartYear.AddDays(x).DayOfWeek == DayOfWeek.Sunday) {
                    break; // TODO: might not be correct. Was : Exit For
                }
            }
    
            if (weekNum == 1) {
                DayOfYearWeekStart = StartYear;
                DayOfYearWeekEnd = StartYear.AddDays(x - 1);
            } else if (weekNum > 1) {
                DayOfYearWeekStart = StartYear.AddDays(((weekNum - 2) * 7) + x);
                DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6);
            }
    
        }
    
        int[] Month = new int[2];
        Month[0] = DayOfYearWeekStart.Month;
        Month[1] = DayOfYearWeekEnd.Month;
    
        return Month;
    }
    
    public int[]getMonth(int weekNum,int year)
    {
    DateTime StartYear=新的日期时间(年,1,1);
    System.DayOfWeek StartDOW=StartYear.DayOfWeek;
    DateTime DayOfYearWeekStart=默认值(DateTime);
    DateTime DayOfYearWeekEnd=默认值(DateTime);
    int x=0;
    if((StartDOW==系统.DayOfWeek.Sunday)){
    DayOfYearWeekStart=StartYear.AddDays((周数-1)*7);
    DayOfYearWeekEnd=DayOfYearWeekStart.AddDays(6);
    }否则{
    对于(x=0;x 1){
    DayOfYearWeekStart=StartYear.AddDays(((周数-2)*7)+x);
    DayOfYearWeekEnd=DayOfYearWeekStart.AddDays(6);
    }
    }
    整数[]月=新整数[2];
    月[0]=DayOfYearWeekStart.Month;
    月[1]=DayOfYearWeekEnd.Month;
    返回月份;
    }
    

  • 在.NET 3.0及更高版本中,您可以使用

    公共静态整数月初日(整数年,整数周)
    {
    返回ISOWeek.ToDateTime(年、周、星期一)。月;
    }
    

    请注意,这一年可能不合适,因为一年的第一周可能已经开始于前一年的12月底。例如,2020年的第一周开始于2019-12-30星期一。

    这是文化信息中定义的,相反的定义并不明确。下面的答案包含一些相关问题,请尝试回答它们。如果我们谈论的是如果是ISO8601一周,那么基于中的算法的东西会更真实。你为什么会这样假设?你不妨假设一周是366天。你会在52天中正确一次;-)我不会假设,我会完全指定问题,然后编写符合该规范的代码。因为问题中没有这样做,所以我选择了最简单的方法来解决在大多数情况下有意义的未指定问题。
    public int[] getMonth(int weekNum, int year)
    {
    
        DateTime StartYear = new DateTime(year, 1, 1);
        System.DayOfWeek StartDOW = StartYear.DayOfWeek;
        DateTime DayOfYearWeekStart = default(DateTime);
        DateTime DayOfYearWeekEnd = default(DateTime);
        int x = 0;
        if ((StartDOW == System.DayOfWeek.Sunday)) {
            DayOfYearWeekStart = StartYear.AddDays((weekNum - 1) * 7);
            DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6);
        } else {
            for (x = 0; x <= 7; x += 1) {
                if (StartYear.AddDays(x).DayOfWeek == DayOfWeek.Sunday) {
                    break; // TODO: might not be correct. Was : Exit For
                }
            }
    
            if (weekNum == 1) {
                DayOfYearWeekStart = StartYear;
                DayOfYearWeekEnd = StartYear.AddDays(x - 1);
            } else if (weekNum > 1) {
                DayOfYearWeekStart = StartYear.AddDays(((weekNum - 2) * 7) + x);
                DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6);
            }
    
        }
    
        int[] Month = new int[2];
        Month[0] = DayOfYearWeekStart.Month;
        Month[1] = DayOfYearWeekEnd.Month;
    
        return Month;
    }