2011-10-27 43 views
12

Tôi đang cố tạo lịch bằng wpf. Bằng cách sử dụng itemsPanel và nhiều hơn nữa, tôi có một lưới với 7 cột (chủ nhật-thứ bảy) và 6 hàng (tuần của tháng). Nếu tôi có thể tìm thấy vị trí bắt đầu của ngày đầu tiên của mỗi tháng bằng cách lấy số ngày trong tuần và tuần (của tháng), làm thế nào tôi có thể tìm số tuần (0-5 mỗi tháng)? Cũng không thể bằng cách nào đó tôi chỉ cần điền vào lịch từ đó? Tôi bị mất và tôi không biết những gì khác để thử.Làm cách nào để xác định số tuần của một ngày nhất định?

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; 
    } 

Trả lời

17

Bạn phải sử dụng Calendar.GetDayOfWeekCalendar.GetWeekOfYear ưu tiên để viết cho mình.

Bạn có thể đảm bảo rằng nếu bạn tự viết bất kỳ mã xử lý ngày/giờ nào, mã sẽ chứa lỗi và sẽ không hoạt động ở các ngôn ngữ khác nhau.

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; 
    } 
} 

cùng với DataGrid bắt buộc trong XAML:

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

Vì vậy, điều này sẽ trở lại những gì tuần đó là ngày 1-53, làm thế nào để tôi lấy thông tin đó và sử dụng nó mặc dù b/c lưới của tôi có 6 hàng grid.row 0-5. Xin lỗi vì sự thiếu hiểu biết này là tất cả mới đối với tôi. Nói cách khác các coloumns là những gì ngày và hàng tuần là tuần #. Tôi không biết làm thế nào để áp dụng cho lưới và điền vào tất cả trong – TMan

+0

@TMan Tôi đã thêm một ví dụ làm việc về cách bạn có thể làm điều này; –

+0

cảm ơn, những gì là var ms và tôi được sử dụng cho, họ không bao giờ được sử dụng cho bất cứ điều gì? – TMan

11

Bạn có thể sử dụng Calendar.GetWeekOfYear từ Toàn cầu hóa để thực hiện việc này.

Dưới đây là các tài liệu MSDN cho nó: http://msdn.microsoft.com/en-us/library/system.globalization.calendar.getweekofyear.aspx

Bạn nên vượt qua các thuộc tính văn hóa thích hợp CultureInfo.CurrentCulture-GetWeekOfYear để bạn có phù hợp với văn hóa hiện đúng cách.

Ví dụ:

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

Bạn có thể dễ dàng sửa đổi này vào một phương pháp mở rộng trên DateTime:

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

+1 - nhưng tôi muốn nói "phải sử dụng" chứ không phải "có thể sử dụng" - ref câu trả lời của tôi –

+0

tôi sẽ cảnh cáo bạn chống lại bạn dựa vào phương pháp đó bao nhiêu - nó sẽ cho bạn kết quả không phù hợp. Ví dụ: ngày 30 tháng 12 năm 2012 là ngày chủ nhật. Nếu bạn gọi phương thức đó với WeekRule của FirstDay hoặc FirstFourDayWeek và Sunday là ngày đầu tiên của tuần, nó sẽ trả về 53. Tuy nhiên, nếu bạn gọi phương thức đó với ngày 1 tháng 1 năm 2013, là một phần của cùng một tuần, bạn sẽ nhận được 1. – AndrewS

+0

Vì vậy, điều này sẽ trở lại những gì tuần đó là ngày 1-53, làm thế nào để tôi lấy thông tin đó và sử dụng nó mặc dù b/c lưới của tôi có 6 hàng grid.row 0-5. Xin lỗi vì sự thiếu hiểu biết này là tất cả mới đối với tôi. – TMan

Các vấn đề liên quan