1

次の10週間をリストアップしようとしています

結果は次のようになります。

Week        Year
----------------
45:         2012  
46:         2012  
47:         2012  
48:         2012  
49:         2012  
50:         2012  
51:         2012  
52:         2012  
1:          2013  
2:          2013  

53週目がある年もあり、今年は12月31日が月曜日ですが、今週は1週目ですか、それとも53週目ですか??

とにかく、53週目はいつでも飛ばしたいです。これは、1 日または 2 日がリストのどの週にも含まれないことを意味しますが、これは問題ではありません。

4

4 に答える 4

2

ある年には53週があり、今年は12月31日が月曜日ですが、今週は1週ですか、それとも53週ですか。

「週年の週」を意味すると仮定すると、それは2013年の週年の第1週になります。

ISOカレンダーでは、週の最初の週は、4日以上含まれる最初の月曜日から日曜日の週です。

53週目をスキップする理由は明確ではありません。1日または2日スキップするだけでなく、1週間スキップします。

もちろん、これは実際には「年の週」のISO定義を意味することを前提としています。そうでなければ、それは別の問題です。他のことをする前に、要件を明確にする必要があります。

.NETから週の年を取得するには、使用Calendar.GetWeekOfYearするISO定義に-を使用CalendarWeekRule.FirstFourDayWeekDayOfWeek.Mondayます。でも、その週の年自体を取得するものがあるかどうかはわかりません。

露骨なプラグとして、私の野田時間WeekYearでは、日付と日付の両方がサポートされてWeekOfWeekYearおり、特定の週-年/週-週-年/曜日の組み合わせの日付を作成できます。

于 2012-11-13T18:56:34.523 に答える
1

私はちょうどそれを行う小さなコンソールアプリを書きました:

static void Main(string[] args)
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        DateTime dt = DateTime.Now; //Use current date as starting point
        for (int i = 0; i < 10; i++)
        {

            int weekNo = ci.Calendar.GetWeekOfYear(
            dt,
            ci.DateTimeFormat.CalendarWeekRule,
            ci.DateTimeFormat.FirstDayOfWeek
             );
            int year = ci.Calendar.GetYear(dt);
            if (weekNo == 53) //if week number==53, then go to next week
            {
                dt = dt.AddDays(7);
                weekNo = ci.Calendar.GetWeekOfYear(
                dt,
                ci.DateTimeFormat.CalendarWeekRule,
                ci.DateTimeFormat.FirstDayOfWeek
                 );
                year = ci.Calendar.GetYear(dt);
            }

            dt = dt.AddDays(7);
            Console.WriteLine(weekNo + "-" + year);
        }
    }  

今日の出力:

    46-2012
    47-2012
    48-2012
    49-2012
    50-2012
    51-2012
    52-2012
    1-2013
    2-2013
    3-2013
于 2012-11-13T18:59:51.090 に答える
0

msdnからhttp://msdn.microsoft.com/en-us/library/system.globalization.calendar.getweekofyear.aspx

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
      DateTime date1 = new DateTime(2011, 1, 1);
      Calendar cal = dfi.Calendar;

      Console.WriteLine("{0:d}: Week {1} ({2})", date1, 
                        cal.GetWeekOfYear(date1, dfi.CalendarWeekRule, 
                                          dfi.FirstDayOfWeek),
                        cal.ToString().Substring(cal.ToString().LastIndexOf(".") + 1));       
   }
}
// The example displays the following output: //       1/1/2011: Week 1 (GregorianCalendar)
于 2012-11-13T18:56:12.753 に答える
-1

以下は、年の初めからの週数に基づいて機能します。

これを完全な週に基づくようにする場合は、年の最初の週の日に基づいて、開始時に 0 または 1 のオフセットを決定する必要があります。

public class Week
{
    public Week(int weekOfYear, int year)
    {
        WeekOfYear = weekOfYear;
        Year = year;
    }
    public int WeekOfYear { get; private set; }
    public int Year { get; private set; }
}
public IEnumerable<Week> Next10Weeks(DateTime startDate)
{
    DateTime tempDate = startDate;
    for (int i = 0; i < 10; i++)
    {
        //add one to first parameter if you want the 1-indexed week instead of 0 indexed
        yield return new Week(tempDate.DayOfYear % 7, tempDate.Year);
        tempDate.AddDays(7);
    }
}
于 2012-11-13T18:57:34.230 に答える