2017-05-06 5 views
0

ご挨拶最初の日と最後の日は何ですか、私はちょっと調べましたが、何も出ませんでした。私はWeekNumberを取得する方法を知っていますが、他のプロパティを取得しようとすると問題が発生します。週 "、誰かが何か手掛かりを持っていますか?その感謝します。年以内に数週間のリストを作成する

更新

私はそれがより明確にしましょう、何を私が知りたいことは、週の最初の日で、私は年の最初の週以内にしています知っていると言うことができます例えばです:月曜日2017最終日は2017-1-7日です。

+1

「最初の曜日」は文化固有のものです。これについては、[this one](http://stackoverflow.com/questions/38039/how-私にとっては、週の始まりのための日時を得ることができます) – stuartd

+0

@stuartdありがとう私は見ていきます – Valkyrie

+0

'CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek'を参照してください。 –

答えて

2

私はしばらく前にそのようなことをしました。私はそれが助けかどうかを確認、あなたのクラスに私のコードを適応してきました:

public static List<WeekOfYear> GetWeeksOfYear(int year) 
{ 
    var weeksQuantity = GetNumberOfWeeksInYear(year); 
    var weeksList = new List<WeekOfYear>(); 

    for (int i = 1; i <= weeksQuantity; i++) 
    { 
     var weekNumber = i; 

     DateTime firstDay; 
     DateTime lastDay; 
     GetFirstAndLastDateOfWeek(year, weekNumber, out firstDay, out lasDay); 

     weeksList.Add(new WeekOfYear 
     { 
      FirstDayOfWeek = firstDay, 
      LastDayOfWeek = lastDay, 
      WeekNumber = weekNumber 
     }); 
    } 

    return weeksList; 
} 

public static int GetNumberOfWeeksInYear(int year) 
{ 
    var dfi = DateTimeFormatInfo.CurrentInfo; 
    var date1 = new DateTime(year, 12, 31); 
    if (dfi != null) 
    { 
     Calendar cal = dfi.Calendar; 
     return cal.GetWeekOfYear(date1, dfi.CalendarWeekRule, 
      dfi.FirstDayOfWeek); 
    } 

    return 0; 
} 

public static void GetFirstAndLastDateOfWeek(int year, int weekOfYear, out DateTime firstDay, out DateTime lastDay) 
{ 
    var ci = CultureInfo.CurrentCulture; 

    DateTime jan1 = new DateTime(year, 1, 1); 
    int daysOffset = (int)ci.DateTimeFormat.FirstDayOfWeek - (int)jan1.DayOfWeek; 
    DateTime firstWeekDay = jan1.AddDays(daysOffset); 
    int firstWeek = ci.Calendar.GetWeekOfYear(jan1, ci.DateTimeFormat.CalendarWeekRule, ci.DateTimeFormat.FirstDayOfWeek); 
    if ((firstWeek <= 1 || firstWeek >= 52) && daysOffset >= -3) 
    { 
     weekOfYear -= 1; 
    } 

    firstDay = firstWeekDay.AddDays(weekOfYear * 7); 
    lastDay = firstDay.AddDays(6); 
} 
0

このコードは、おそらくあなたにいくつかの助けを与えます。

class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach(var week in 2017.GenerateWeekSequence()) 
     { 
      Console.WriteLine($"Week ({week.WeekNumber}. First day={week.FirstDayOfWeek.ToString()}, Last day={week.LastDayOfWeek.ToString()}"); 
     } 
    } 
} 

public static class WeekExtensions 
{ 
    private static CultureInfo ThreadCulture => Thread.CurrentThread.CurrentCulture; 
    public class Info 
    { 
     public Info(DateTime firstDayOfWeek) { FirstDayOfWeek = firstDayOfWeek; } 

     public int WeekNumber => ThreadCulture.Calendar.GetWeekOfYear(
      FirstDayOfWeek, CalendarWeekRule.FirstDay, ThreadCulture.DateTimeFormat.FirstDayOfWeek); 

     public DateTime FirstDayOfWeek { get; } 

     public DateTime LastDayOfWeek => FirstDayOfWeek.AddDays(6); 
    } 

    public static IEnumerable<Info> GenerateWeekSequence(this int year) 
    { 
     var runner = new DateTime(year, 1, 1); 
     // Move back to the first day of week (even if it's in the previous year) 
     while (runner.DayOfWeek != ThreadCulture.DateTimeFormat.FirstDayOfWeek) 
     { 
      runner = runner.AddDays(-1); 
     } 
     // Now, jump dates one week at a time 
     while (runner.Year <= year) 
     { 
      yield return new Info(runner); 
      runner = runner.AddDays(7); // Jump to first day of next week 
     } 
    } 
} 
関連する問題