How can I set a DateTime to the first of the month in C#?
Asked
Active
Viewed 1.1e+01k times
107
-
the start of the current month? – Phil Gan Feb 15 '11 at 10:36
-
1so what to get about it,.. every month's date starts with 1..does he want to know the Day on the start of the Month – Shekhar_Pro Feb 15 '11 at 10:37
-
If we are in Jan, it should show 01-Jan-2011 and in Feb, then 01-Feb-2011 – learning Feb 15 '11 at 10:38
-
you can look into [this](http://stackoverflow.com/questions/4883481/finding-first-day-of-calendar/4883527#4883527) – V4Vendetta Feb 15 '11 at 10:39
9 Answers
216
var now = DateTime.Now;
var startOfMonth = new DateTime(now.Year,now.Month,1);

weeksdev
- 4,265
- 21
- 36

Nick Jones
- 6,413
- 2
- 18
- 18
-
64A tip: always put `DateTime.Now` into a variable and use that if you are going to use the value repeatedly. There is a small chance of an error in case this code is executed exactly around midnight; the two calls to `DateTime.Now` may happen on each side of midnight causing possibly odd effects. – Fredrik Mörk Feb 15 '11 at 10:43
-
Good point. I think midnight on new year's eve is the time this will potentially cause a problem. – Nick Jones Feb 15 '11 at 10:48
-
1Not just New Year's. It'd be a problem at midnight on the last day of any month. In any case, it'd only be a problem if it executed on that very nanosecond of midnight at the end of the month. But since you fixed your code, all's good now. – Doug S Nov 10 '12 at 04:58
-
1
-
4@markthewizard1234 mainly because C# programmers are lazy. So we just use var whenever possible since it's only three characters. There are other reasons but I feel this is the main reason for most people to do it. – Tim Pohlmann Apr 18 '16 at 13:35
-
My rule on var assignments is if the right hand side makes the type obvious, then var is fine. If it's obscure, probably spell out the type, unless it's unecessarily long type (generics nested in generics etc), being used in another statement where it's clear what it is and/or the method specifies the type being returned. Or, mostly I'll use var unless it needs to be clear. – tjmoore Oct 04 '19 at 13:13
-
@tjmoore I have different point of views. i always use `var`. It is good when you are going to refactor or rename a variable name. It will change the data type accordingly. For example, `Customer customer = new Customer()` to `var vipCustomer = new VIPCustomer();` As you can see, I just need to change the variable name and data type (right hand side), costs me 2 steps. It will cost me 3 steps if I not using `var` (left hand side). You will feel the different when you maintain a legacy project or refactor them. `var` is my good friend :) – sky91 Jun 17 '20 at 22:28
42
Something like this would work
DateTime firstDay = DateTime.Today.AddDays(1 - DateTime.Today.Day);

V4Vendetta
- 37,194
- 9
- 78
- 82
-
5As Fredrik Mork commented on Nick Jones answer, it's best to store the Datetime in a variable when you're using it multiple times, to guarantee no problems around midnight on the last day of the month. So: DateTime today = DateTime.Today; DateTime firstDay = today.AddDays(1-today.Day); – Doug S Nov 10 '12 at 05:02
14
public static DateTime FirstDayOfMonth(this DateTime current)
{
return current.AddDays(1 - current.Day);
}

fubo
- 44,811
- 17
- 103
- 137
9
A bit late to the party but here's an extension method that did the trick for me
public static class DateTimeExtensions
{
public static DateTime FirstDayOfMonth(this DateTime dt)
{
return new DateTime(dt.Year, dt.Month, 1);
}
}

Colin Banbury
- 857
- 10
- 17
-
1The problem with this is that it doesn't keep the original timezone. – Mike Cole Apr 30 '15 at 18:18
2
I've just create some extension methods based on Nick answer and others on the SO
public static class DateTimeExtensions
{
/// <summary>
/// get the datetime of the start of the week
/// </summary>
/// <param name="dt"></param>
/// <param name="startOfWeek"></param>
/// <returns></returns>
/// <example>
/// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
/// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
/// </example>
/// <remarks>http://stackoverflow.com/a/38064/428061</remarks>
public static System.DateTime StartOfWeek(this System.DateTime dt, DayOfWeek startOfWeek)
{
var diff = dt.DayOfWeek - startOfWeek;
if (diff < 0)
diff += 7;
return dt.AddDays(-1 * diff).Date;
}
/// <summary>
/// get the datetime of the start of the month
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
/// <remarks>http://stackoverflow.com/a/5002582/428061</remarks>
public static System.DateTime StartOfMonth(this System.DateTime dt) =>
new System.DateTime(dt.Year, dt.Month, 1);
/// <summary>
/// get datetime of the start of the year
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static System.DateTime StartOfYear(this System.DateTime dt) =>
new System.DateTime(dt.Year, 1, 1);
}

Søren
- 6,517
- 6
- 43
- 47
2
DateTime now = DateTime.Now;
DateTime date = new DateTime(now.Year, now.Month, 1);
You can use anything else instead of DateTime.Now

rotman
- 1,641
- 1
- 12
- 25
0
This should be efficient and correct:
DateTime RoundDateTimeToMonth(DateTime time)
{
long ticks = time.Ticks;
return new DateTime((ticks / TimeSpan.TicksPerDay - time.Day + 1) * TimeSpan.TicksPerDay, time.Kind);
}
Here ticks / TimeSpan.TicksPerDay
returns count of full days up to given time
and - time.Day + 1
resets this count to the beginning of month.

nayato
- 83
- 5
-2
var currentDate = DateTime.UtcNow.Date;
var startDateTimeOfCurrentMonth = currentDate.AddDays(-(currentDate.Day - 1));

Jay Shah
- 3,553
- 1
- 27
- 26
-
3
-
2Although this code might solve the problem, it is always encouraged to add an explanation explaining why/how it works to it. – BDL Apr 05 '17 at 10:54
-
@ThomasAyoub - No this is not a Quite duplicate of fubo's answer as this won't contain the time portain. – Jay Shah Apr 05 '17 at 11:23
-
@BDL - I think it's very simple to understand which does not require explanation. But FYI, I have taken current Utc Date and then subtracted (Days of current date - 1) from it to get the start date of month i.e 1 (not 0 and that's why I subtracted 1). And yes, this will definitely solve the problem. – Jay Shah Apr 05 '17 at 13:06