definir DateTime para o início do mês


97

Como posso definir um DateTime para o primeiro dia do mês em C #?


o início do mês atual?
Phil Gan

1
então o que fazer sobre isso, .. a data de cada mês começa com 1 .. ele quer saber o dia no início do mês
Shekhar_Pro

Se estivermos em janeiro, deve mostrar 01 de janeiro de 2011 e em fevereiro, então 01 de fevereiro de 2011
aprendendo

você pode dar uma olhada nisso
V4Vendetta

Respostas:


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

62
Uma dica: sempre coloque DateTime.Nowem uma variável e use-a se for usar o valor repetidamente. Há uma pequena chance de erro no caso de este código ser executado exatamente por volta da meia-noite; as duas chamadas para DateTime.Nowpodem acontecer em cada lado da meia-noite, causando efeitos possivelmente estranhos.
Fredrik Mörk de

Bom ponto. Acho que a meia-noite da véspera de ano novo é o momento em que isso potencialmente causará um problema.
Nick Jones de

1
Não apenas no Ano Novo. Seria um problema à meia-noite do último dia de qualquer mês. Em qualquer caso, só seria um problema se fosse executado naquele mesmo nanosegundo da meia-noite do final do mês. Mas, como você corrigiu seu código, está tudo bem agora.
Doug S de

1
por que você está usando "var" em vez de "DateTime"?
markthewizard1234

4
@ markthewizard1234 principalmente porque os programadores C # são preguiçosos. Portanto, apenas usamos var sempre que possível, pois ele tem apenas três caracteres. Existem outras razões, mas acho que esta é a principal razão para a maioria das pessoas fazerem isso.
Tim Pohlmann de

41

Algo assim funcionaria

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

4
Como Fredrik Mork comentou sobre a resposta de Nick Jones, é melhor armazenar o Datetime em uma variável quando você o estiver usando várias vezes, para garantir que não haja problemas por volta da meia-noite do último dia do mês. Portanto: DateTime today = DateTime.Today; DateTime firstDay = today.AddDays (1-today.Day);
Doug S de

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

1
Isso é melhor porque mantém o fuso horário.
Rosdi Kasim

8

Um pouco tarde para a festa, mas aqui está um método de extensão que funcionou para mim

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

1
O problema com isso é que ele não mantém o fuso horário original.
Mike Cole

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

Você pode usar qualquer outra coisa em vez de DateTime.Now


2

Acabei de criar alguns métodos de extensão com base na resposta de Nick e outros no 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

Isso deve ser eficiente e correto:

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

Aqui, ticks / TimeSpan.TicksPerDayretorna a contagem de dias inteiros até determinado timee - time.Day + 1redefine essa contagem para o início do mês.


0

Espero que isso ajude você.

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


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

3
Esta é uma duplicata e tanto da resposta de fubo, você não acha?
Thomas Ayoub,

2
Embora este código possa resolver o problema, é sempre recomendado adicionar uma explicação explicando por que / como funciona para ele.
BDL de

@ThomasAyoub - Não, não é uma duplicata completa da resposta de fubo, pois não contém o tempo portain.
Jay Shah,

@BDL - Acho muito simples de entender que não requer explicação. Mas, para sua informação, peguei a Data Utc atual e subtraí (Dias da data atual - 1) para obter a data de início do mês, ou seja, 1 (não 0 e é por isso que subtraí 1). E sim, isso definitivamente resolverá o problema.
Jay Shah,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.