Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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#_Winforms - Fatal编程技术网

C# 如何将日期列表拆分为周

C# 如何将日期列表拆分为周,c#,winforms,C#,Winforms,我有一个日期列表,从2015年7月到2016年1月 2015/07/20 14:15:23 2015/07/20 14:16:06 2015/07/26 23:39:15 2015/09/02 22:51:46 2015/09/02 22:52:33 2015/10/26 20:42:23 2015/11/12 14:54:31 2015/11/30 06:49:10 2015/12/02 10:18:17 2015/12/10 08:34:53 2015/12/10 15:

我有一个日期列表,从2015年7月到2016年1月

2015/07/20 14:15:23 2015/07/20 14:16:06 2015/07/26 23:39:15 2015/09/02 22:51:46 2015/09/02 22:52:33 2015/10/26 20:42:23 2015/11/12 14:54:31 2015/11/30 06:49:10 2015/12/02 10:18:17 2015/12/10 08:34:53 2015/12/10 15:15:33 2015/12/15 06:43:32 2015/12/29 02:55:01 2016/01/12 19:46:45 2016/01/13 07:31:14 2016/01/13 07:32:59 2016/01/14 05:28:33 最后,我将创建一个图表,显示每周属于多少个实例

谢谢

编辑


2015/07/20
2016/01/14
大约有25周。我想返回1-25,如果它大于0,则返回属于该组的周数。

如果您想要一年中的周数,可以使用
日历
类:

DateTime date = new DateTime(2015, 07, 20);

DateTimeFormatInfo dateTimeFormatInfo = DateTimeFormatInfo.CurrentInfo;  // Current culture-specific information about the format of date and time.          
Calendar calendar = dateTimeFormatInfo.Calendar;                         // Calendar used in current culture.

var weekOfYear = calendar.GetWeekOfYear(date,                                // The date
                                        dateTimeFormatInfo.CalendarWeekRule, // Rule for determining the first week of the year.
                                        dateTimeFormatInfo.FirstDayOfWeek);  // Day used as the first day of week
编辑:

您可以创建对
DateTime
的扩展,返回一周以便于使用:

public static class DateTimeExtensions
{
    public static int GetWeekOfYear(this DateTime date)
    {
        DateTimeFormatInfo dateTimeFormatInfo = DateTimeFormatInfo.CurrentInfo;
        Calendar calendar = dateTimeFormatInfo.Calendar;

        var weekOfYear = calendar.GetWeekOfYear(date,
                                                dateTimeFormatInfo.CalendarWeekRule,
                                                dateTimeFormatInfo.FirstDayOfWeek);

        return weekOfYear;
    }
}
并使用
GroupBy()
对日期进行分组:

你的意思是这样的(它做出了一些简化的假设):

List DateList=newlist();
DateList.Add(DateTime.Parse(“7/20/2015 2:15:23 PM”);
DateList.Add(DateTime.Parse(“7/20/2015 2:16:06 PM”);
DateList.Add(DateTime.Parse(“7/26/2015 11:39:15 PM”);
DateList.Add(DateTime.Parse(“9/2/2015 10:51:46 PM”);
DateList.Add(DateTime.Parse(“9/2/2015 10:52:33 PM”);
DateList.Add(DateTime.Parse(“10/26/2015 8:42:23 PM”);
DateList.Add(DateTime.Parse(“11/12/2015 2:54:31 PM”);
DateList.Add(DateTime.Parse(“11/30/2015 6:49:10 AM”);
DateList.Add(DateTime.Parse(“12/2/2015 10:18:17 AM”);
DateList.Add(DateTime.Parse(“12/10/2015 8:34:53 AM”);
DateList.Add(DateTime.Parse(“12/10/2015 3:15:33 PM”);
DateList.Add(DateTime.Parse(“12/15/2015 6:43:32 AM”);
DateList.Add(DateTime.Parse(“12/29/2015 2:55:01 AM”);
DateList.Add(DateTime.Parse(“1/12/2016 7:46:45 PM”);
DateList.Add(DateTime.Parse(“1/13/2016 7:31:14 AM”);
DateList.Add(DateTime.Parse(“1/13/2016 7:32:59 AM”);
DateList.Add(DateTime.Parse(“1/14/2016 5:28:33 AM”);
Dictionary MyHistogram=新字典();
foreach(日期列表中的日期时间MyDateTime)
{
int Week=MyDateTime.DayOfYear/7;
如果(MyHistogram.ContainsKey(周))
我的直方图[周]+;
其他的
MyHistogram.Add(第1周);
}

计算出你需要什么是相当简单的,但最复杂的是计算出你一年中的哪一周。NET框架通过提供许多不同的日历(包括许多没有的日历)来帮助您。很可能您只需使用
CultureInfo.CurrentCulture.DateTimeFormat.Calendar
即可获取日历

然后你可以这样做:

var results =
    dates
        .GroupBy(x => CultureInfo.CurrentCulture.DateTimeFormat.Calendar
            .GetWeekOfYear(x, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday))
        .SelectMany(gx => gx, (gx, x) => new
        {
            Week = gx.Key,
            DateTime = x,
            Count = gx.Count(),
        });
请注意,周数基于
CalendarWeekRule
DayOfWeek
的两个额外参数。第一个参数可以选择
FirstDay、FirstFourDayWeek、FirstFullWeek
,第二个参数可以选择一周中的任何一天

我已经使用了
.SelectMany
来平展结果以及如何获得周数和计数,但是您可能需要以不同的格式生成数据,但这应该有助于计算

以下是我得到的结果:


根据您的编辑,从最早的日期开始按周分组的查询非常容易

var firstDay = dates.Min().Date;

var results =
    dates
        .GroupBy(x => x.Date.Subtract(firstDay).Days / 7 + 1)
        .SelectMany(gx => gx, (gx, x) => new
        {
            Week = gx.Key,
            DateTime = x,
            Count = gx.Count(),
        });
我现在得到这个结果:


我不明白您所说的“如果超过0,则计算属于该组的周数”是什么意思。

那么您正在查找一年中的周数?在这里,您可以找到如何获得一周。我已将日期转换为ISO格式,即使在这个问题上,很清楚使用的是什么格式,但使用国际标准来避免歧义仍然是一种良好的做法。我将结合LINQ。类似于groupedDates=myDateList.GroupBy(d=>myCalendar.GetWeekOfYear(d))。然后,您可以获得每个组的计数,并根据需要以其他方式继续处理。我需要重新回答我的答案,但最早的日期是2015年7月20日,到1月14日还有26周。这就是我希望每个日期时间分组的方式,26周。这可能吗?@Sewder-你可以用你想要的任何一周组合预先初始化柱状图“bucket”(将每个组合初始化为零)。我添加了一个编辑,我想将日期分为大约25周,从最早的日期到最晚的日期,每一周一个。
List<DateTime> DateList = new List<DateTime>();

DateList.Add(DateTime.Parse("7 / 20 / 2015 2:15:23 PM"));
DateList.Add(DateTime.Parse(" 7 / 20 / 2015 2:16:06 PM"));
DateList.Add(DateTime.Parse(" 7 / 26 / 2015 11:39:15 PM"));
DateList.Add(DateTime.Parse(" 9 / 2 / 2015 10:51:46 PM"));
DateList.Add(DateTime.Parse(" 9 / 2 / 2015 10:52:33 PM"));
DateList.Add(DateTime.Parse(" 10 / 26 / 2015 8:42:23 PM"));
DateList.Add(DateTime.Parse(" 11 / 12 / 2015 2:54:31 PM"));
DateList.Add(DateTime.Parse(" 11 / 30 / 2015 6:49:10 AM"));
DateList.Add(DateTime.Parse(" 12 / 2 / 2015 10:18:17 AM"));
DateList.Add(DateTime.Parse(" 12 / 10 / 2015 8:34:53 AM"));
DateList.Add(DateTime.Parse(" 12 / 10 / 2015 3:15:33 PM"));
DateList.Add(DateTime.Parse(" 12 / 15 / 2015 6:43:32 AM"));
DateList.Add(DateTime.Parse(" 12 / 29 / 2015 2:55:01 AM"));
DateList.Add(DateTime.Parse(" 1 / 12 / 2016 7:46:45 PM"));
DateList.Add(DateTime.Parse(" 1 / 13 / 2016 7:31:14 AM"));
DateList.Add(DateTime.Parse("1 / 13 / 2016 7:32:59 AM"));
DateList.Add(DateTime.Parse("1 / 14 / 2016 5:28:33 AM"));

Dictionary<int, int> MyHistogram = new Dictionary<int, int>();

foreach(DateTime MyDateTime in DateList)
{
    int Week = MyDateTime.DayOfYear / 7;

    if (MyHistogram.ContainsKey(Week))
        MyHistogram[Week]++;
    else
        MyHistogram.Add(Week, 1);
}
var results =
    dates
        .GroupBy(x => CultureInfo.CurrentCulture.DateTimeFormat.Calendar
            .GetWeekOfYear(x, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday))
        .SelectMany(gx => gx, (gx, x) => new
        {
            Week = gx.Key,
            DateTime = x,
            Count = gx.Count(),
        });
var firstDay = dates.Min().Date;

var results =
    dates
        .GroupBy(x => x.Date.Subtract(firstDay).Days / 7 + 1)
        .SelectMany(gx => gx, (gx, x) => new
        {
            Week = gx.Key,
            DateTime = x,
            Count = gx.Count(),
        });