2011-10-27 26 views
12

我想使用wpf製作日曆。通過使用itemsPanel等,我有一個7列(星期日 - 星期六)和6行(星期#月)的網格。如果我可以通過獲取每月的週日和週數來找到每個月的第一個開始位置,我怎麼能找到每週的數字(每個月的0-5)?也不能以某種方式從那裏填寫日曆?我迷路了,我不知道還有什麼要嘗試。如何確定某個日期的週數?

public partial class SchedulePage : Page 
{   
    MainWindow _parentForm; 
    public int dayofweek; 

    public SchedulePage(MainWindow parentForm) 
    { 
     InitializeComponent(); 
     _parentForm = parentForm; 
     // DateTime date = new DateTime(year, month, day); 

     _parentForm.bindings = new BindingCamper();   
     _parentForm.bindings.schedule.Add(new Schedule { WeekNo = (int) getWeekNumber(), WeekDay = dayofweek }); 
     DataContext = _parentForm.bindings; 
     // lblTest.Content = dates(2011, 10, 27); 
    } 

    public double getWeekNumber() 
    { 
     dayofweek = getWeekDay(2011, 10, 31); 
     double h = dayofweek/7; 
     double g = Math.Floor(h); 
     return g; 
    } 

    public int getWeekDay(int year, int month, int day) 
    { 
     //year = 2011; 
     //month = 10; 
     //day = 27; 
     int[] t = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 }; 
     // year -= month < 3; 
     return (year + year/4 - year/100 + year/400 + t[month - 1] + day) % 7; 
    } 

回答

17

必須使用Calendar.GetDayOfWeekCalendar.GetWeekOfYear優先於自己編寫。

您可以保證,如果您自己編寫任何日期/時間處理代碼,它將包含錯誤,並且不會在不同的語言環境中工作。

public class Row 
{ 
    public string MonthWeek { get; set; } 
    public string Year { get; set; } 
    public string Month { get; set; } 
    public string Day { get; set; } 
    public string WeekOfYear { get; set; } 
} 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     var l = new List<Row>(); 
     DateTime startDate = DateTime.Now; 
     DateTime d = new DateTime(startDate.Year, startDate.Month, 1); 
     var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar; 
     var ms = cal.GetWeekOfYear(new DateTime(d.Year, d.Month, 1), System.Globalization.CalendarWeekRule.FirstDay, System.DayOfWeek.Sunday); 
     for (var i = 1; d.Month == startDate.Month; d = d.AddDays(1)) 
     { 
      var si = new Row(); 
      var month_week = (d.Day/7) + 1; 
      si.MonthWeek = month_week.ToString(); 
      si.Month = d.Year.ToString(); 
      si.Year = d.Month.ToString(); 
      si.Day = d.Day.ToString(); 
      si.WeekOfYear = cal.GetWeekOfYear(d, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString(); 
      l.Add(si); 
     } 
     dataGrid1.ItemsSource = l; 
    } 
} 
與在XAML強制性的DataGrid

在一起:

<DataGrid AutoGenerateColumns="true" Name="dataGrid1" /> 
+0

因此,這將返回哪一天的日期是1-53,我如何獲取該信息並使用它,儘管b/c我的網格有6行grid.row 0-5。對不起,這對我來說都是陌生的。換句話說,coloumns是星期幾,星期是#。我不知道如何將它應用到網格並填充全部 – TMan

+0

@TMan我已經添加了一個如何做到這一點的工作示例; –

+0

謝謝,什麼是var ms和我用,他們從來沒有用過任何東西? – TMan

11

您可以使用全球化的Calendar.GetWeekOfYear來執行此操作。

這裏的MSDN文檔它:http://msdn.microsoft.com/en-us/library/system.globalization.calendar.getweekofyear.aspx

你應該從CultureInfo.CurrentCulture傳遞適當的文化屬性,以GetWeekOfYear讓你正確地匹配當前的文化。

例子:

int GetWeekOfYear(DateTime date) 
{ 
    return Calendar.GetWeekOfYear(
     date, 
     CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule, 
     CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek 
    ); 
} 

你可以很容易地修改此爲一個擴展方法上DateTime

static int GetWeekOfYear(this DateTime date) 
{ 
    return Calendar.GetWeekOfYear(
     date, 
     CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule, 
     CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek 
    ); 
} 
+0

+1 - 但我會說「必須使用」,而不是「可以用」 - 參考我的回答 –

+0

我會警告你不要你依賴這種方法多少 - 它會給你不一致的結果。例如,2012年12月30日是星期天。如果您使用FirstDay或FirstFourDayWeek的WeekRule作爲週一的第一天的星期,那麼它將返回53.但是,如果您在2013年1月1日(即同一周的一部分)中調用該方法,則您將得到1. – AndrewS

+0

所以這將返回哪一個星期的日期是1-53,我如何獲取該信息並使用它,儘管b/c我的網格有6行grid.row 0-5。對不起,這對我來說都是陌生的。 – TMan

相關問題