Normally I use the below code, but is there a better way?
lastOfMonth = new DateTime(Now.Year, Now.Month, 1).AddMonths(1).AddDays(-1)
Here is how you can get the number of days in the month using Noda Time:
int days = CalendarSystem.Iso.GetDaysInMonth(year, month);
Pretty simple, eh? Well that assumes you know the year and month you are asking about. If you want it for the current month, and in the system's time zone, then you have to specify that explicitly, like this:
DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();
LocalDate localDate = SystemClock.Instance.Now.InZone(tz).Date;
int days = localDate.Calendar.GetDaysInMonth(localDate.Year, localDate.Month);
Noda Time intentionally makes you think about these things, instead of just making the assumptions that DateTime.Now
or DateTime.Today
do.
I would probably use DaysInMonth
as it makes the code a bit more readable and easier to understand (although, I really like your trick :-)). This requieres a similar ammount of typing (which is quite a lot), so I would probably define an extension method:
DateTime LastDayOfMonth(this DateTime) {
var days = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
return new DateTime(DateTime.Now.Year, DateTime.Now.Month, days);
}
Now we can use DateTime.Now.LastDayOfMonth()
which looks a lot better :-).
You can use CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(Now.Year, Now.Month)
I use
DateTime now = DateTime.Today;
var lastDate = new DateTime(now.Year, now.Month, DateTime.DaysInMonth(now.Year, now.Month));
DateTime(year, month, DateTime.DaysInMonth(year, month)).