2011-08-23 11 views
16

Używam następującego zapytania, aby uzyskać następny miesiąc.Jak znaleźć pierwszy dzień następnego miesiąca, jeśli bieżący miesiąc to grudzień

int theMonth = ((System.DateTime)periodStartDate).Month+1; 

Ale jeśli identyfikator okresowyData miesiąca id = s grudnia, powyższe oświadczenie zgłasza błąd.

Czy ktoś wie o rozwiązaniu?

+3

tak naprawdę ta linia wygeneruje błąd? – Fender

+0

Co to jest wyjątek? –

+0

Ślad stosu proszę? – Coops

Odpowiedz

1

po obliczyć theMonth, sprawdź, czy jest równa 13 (po miesiącu grudniu) i zastąp wartość 1:

theMonth = theMonth==13 ? 1 : theMonth; 
5
int theMonth = ((System.DateTime)periodStartDate).AddMonths(1).Month; 
+0

To jest poprawna odpowiedź, jeśli chcesz uzyskać kolejny miesiąc. Może tego właśnie szuka. –

1

Jeśli zadzwonisz AddMonths(1) wtedy .NET automatycznie toczyć datę do następnego roku.

periodStartDate.AddMonths(1).Month; 
14

Wyrażenie ((System.DateTime)periodStartDate).Month+1 nie wyrzuca błąd, jeśli miesiące to grudzień - po prostu zwraca 13. Podejrzewam, że robisz to:

var nextMonth = new DateTime(periodStartDate.Year, periodStartDate.Month + 1, 1); 

To byłoby wyrzucić błąd.

Spróbuj to zamiast:

var nextMonth = new DateTime(periodStartDate.Year, periodStartDate.Month, 1) 
    .AddMonths(1); 
35

myślę, że można je dostać w ten sposób

DateTime dt = new DateTime(2011,12,2); 
DateTime dayone = new DateTime(dt.AddMonths(1).Year, dt.AddMonths(1).Month, 1); 

Teraz masz prawidłowe DateTime obiektu do pierwszego dnia następnego miesiąca, rób jak chcesz z nim

0
DateTime now = DateTime.Now; 
     DateTime nextMonth; 
     if(now.Day > 1) 
     nextMonth = now.AddDays(-(now.Day - 1)).AddMonths(1); 
     else 
     nextMonth = now.AddMonths(1); 

Gdzie jest teraz Data, od której chcesz zacząć, możesz zastąpić TheStartPeriod

11

Lubię odpowiedź V4V, ale piszę to w ten sposób:

DateTime dt = new DateTime(2011,12,2); 
DateTime firstDayNextMonth = dt.AddMonths(1).AddDays(-dt.Day+1); 

Na przykład, może być obliczenie czasu przyszłego, a ten kod robi to bez zdejmowania na część czasu.

Per HVD najbardziej bystry komentarz, ten kod powinien być:

DateTime dt = new DateTime(2011,12,2); 
DateTime firstDayNextMonth = dt.AddDays(-dt.Day+1).AddMonths(1); 
+3

Zakładasz, że 'dt.AddMonths (1) .Day' jest tym samym, co' dt.Day'. Zastanów się, co się stanie, gdy będziesz na przykład 31 stycznia. – hvd

+0

Wielka obserwacja. Zmodyfikowałem przez odpowiedź. –

+0

@hvd - Pierwszy przykład jest dokładnie taki, jak to napisałem. Zajęło mi godzinę, żeby dowiedzieć się, co się dzieje. W moim przypadku, co się stało z wyjątkiem pamięci z kalendarza renderowanego w styczniu w nieskończonej pętli -.- –

0
DateTime date = DateTime.Now; 
Console.WriteLine(date); 
// Sunday 28.06.2015 г. 10:22:41 ч. 

int monthsBack = -1; 
int whichDay = 1; 
// It means -> what day the first day of the previous month is. 
DayOfWeek FirstDayOfWeek = date.AddMonths(monthsBack).AddDays(whichDay).DayOfWeek; 
Console.WriteLine(FirstDayOfWeek); 
// Friday 

int delta = DayOfWeek.Monday - date.AddMonths(monthsBack).AddDays(whichDay).DayOfWeek; 
Console.WriteLine(delta); 
// -4 
//-4 ->Monday , -3 ->Tuesday, -2 ->Wednesday , -1 ->Thursday, 0 ->Friday 
+0

Powinieneś wyjaśnić swój kod. –

Powiązane problemy