DateTime을 월의 시작으로 설정


97

C #에서 DateTime을 매월 1 일로 설정하려면 어떻게해야합니까?


이번 달의 시작?
Phil Gan

1
그래서 그것에 대해 무엇을 얻을 수 있는지, .. 매월 날짜는 1 ..로 시작합니다. 그는 그 달의 시작일에 대해 알고 싶어
합니까

우리가 월에 있다면, 그것은 01 월 - 2011 년 2 월에, 다음 01 2 월 - 2011 표시해야합니다
학습

당신은 이것을
V4Vendetta

답변:


204
var now = DateTime.Now;
var startOfMonth = new DateTime(now.Year,now.Month,1);

62
팁 : 항상 DateTime.Now변수에 넣고 값을 반복적으로 사용하려는 경우 사용하십시오. 이 코드가 정확히 자정 무렵에 실행되면 오류가 발생할 가능성이 적습니다. 두 번의 호출 DateTime.Now이 자정의 양쪽에서 발생하여 이상한 결과를 초래할 수 있습니다.
Fredrik Mörk

좋은 지적. 새해 전날 자정이 잠재적으로 문제를 일으킬 때라고 생각합니다.
Nick Jones

1
새해뿐만 아니라. 어떤 달의 마지막 날 자정에 문제가 될 것입니다. 어쨌든 월말 자정의 매우 나노초에 실행되는 경우에만 문제가 될 것입니다. 그러나 코드를 수정 했으므로 이제 모든 것이 좋습니다.
Doug S

1
"DateTime"대신 "var"를 사용하는 이유는 무엇입니까?
markthewizard1234

4
@ markthewizard1234는 주로 C # 프로그래머가 게으 르기 때문입니다. 그래서 우리는 단지 세 문자이기 때문에 가능할 때마다 var를 사용합니다. 다른 이유도 있지만 이것이 대부분의 사람들이 그렇게하는 주된 이유라고 생각합니다.
Tim Pohlmann

41

이런 식으로 작동합니다.

DateTime firstDay = DateTime.Today.AddDays(1 - DateTime.Today.Day);

4
Fredrik Mork가 Nick Jones의 답변에 대해 언급했듯이 여러 번 사용할 때 Datetime을 변수에 저장하여 해당 월의 마지막 날 자정 무렵에 문제가 없음을 보장하는 것이 가장 좋습니다. 따라서 : DateTime today = DateTime.Today; DateTime firstDay = today.AddDays (1-today.Day);
Doug S

9
public static DateTime FirstDayOfMonth(this DateTime current)
{
    return current.AddDays(1 - current.Day);
}

1
시간대를 유지하기 때문에 더 좋습니다.
Rosdi Kasim

8

파티에 조금 늦었지만 여기에 나를 위해 트릭을 만든 확장 방법이 있습니다.

public static class DateTimeExtensions
{
  public static DateTime FirstDayOfMonth(this DateTime dt)
  {
    return new DateTime(dt.Year, dt.Month, 1);
  }
}

1
이것의 문제는 원래 시간대를 유지하지 않는다는 것입니다.
Mike Cole

2
DateTime now = DateTime.Now;
DateTime date = new DateTime(now.Year, now.Month, 1);

DateTime 대신 다른 것을 사용할 수 있습니다.


2

나는 Nick 답변을 기반으로 일부 확장 방법을 만들고 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);

}

0

이것은 효율적이고 정확해야합니다.

DateTime RoundDateTimeToMonth(DateTime time)
{
    long ticks = time.Ticks;
    return new DateTime((ticks / TimeSpan.TicksPerDay - time.Day + 1) * TimeSpan.TicksPerDay, time.Kind);
}

여기 ticks / TimeSpan.TicksPerDay반환 주어진까지 전체 일의 계산 time- time.Day + 1재설정 월의 시작이 수입니다.


0

도움이 되었기를 바랍니다.

textbox1.Text = "01-"+ DateTime.Now.ToString ( "MMM-yyyy");


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

3
이것은 fubo의 대답과 상당히 중복됩니다. 그렇지 않습니까?
토마스 아 유브

2
이 코드가 문제를 해결할 수 있지만, 작동 이유 / 방법을 설명하는 설명을 항상 추가하는 것이 좋습니다.
BDL

@ThomasAyoub-아니요 이것은 시간 포 테인을 포함하지 않기 때문에 fubo의 대답과 완전히 중복되지 않습니다.
Jay Shah

@BDL-설명이 필요하지 않은 것을 이해하는 것이 매우 간단하다고 생각합니다. 그러나 참고로, 나는 현재 Utc Date를 취한 다음 (현재 날짜의 일-1)을 빼서 (현재 날짜의 날짜-1) 월의 시작 날짜를 얻습니다 (0이 아니라 1을 뺀 이유입니다). 그리고 예, 이것은 확실히 문제를 해결할 것입니다.
Jay Shah
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.