définir DateTime au début du mois


97

Comment puis-je définir un DateTime sur le premier du mois en C #?


le début du mois en cours?
Phil Gan

1
alors que faire, .. la date de chaque mois commence par 1 .. veut-il connaître le jour du début du mois
Shekhar_Pro

Si nous sommes en janvier, cela devrait afficher le 01-janvier-2011 et en février, puis le 01-février-2011
apprentissage du

vous pouvez regarder ceci
V4Vendetta

Réponses:


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

62
Un conseil: mettez toujours DateTime.Nowdans une variable et utilisez-la si vous comptez utiliser la valeur à plusieurs reprises. Il y a un faible risque d'erreur dans le cas où ce code est exécuté exactement vers minuit; les deux appels à DateTime.Nowpeuvent se produire de chaque côté de minuit, provoquant des effets éventuellement étranges.
Fredrik Mörk

Bon point. Je pense que minuit la veille du nouvel an est le moment où cela posera potentiellement un problème.
Nick Jones

1
Pas seulement le Nouvel An. Ce serait un problème à minuit le dernier jour d'un mois. Dans tous les cas, ce ne serait un problème que s'il s'exécutait à la nanoseconde de minuit à la fin du mois. Mais depuis que vous avez corrigé votre code, tout va bien maintenant.
Doug S

1
pourquoi utilisez-vous "var" au lieu de "DateTime"?
markthewizard1234

4
@ markthewizard1234 principalement parce que les programmeurs C # sont paresseux. Nous utilisons donc var autant que possible car il ne s'agit que de trois caractères. Il y a d'autres raisons, mais je pense que c'est la principale raison pour laquelle la plupart des gens le font.
Tim Pohlmann

41

Quelque chose comme ça fonctionnerait

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

4
Comme Fredrik Mork a commenté la réponse de Nick Jones, il est préférable de stocker le Datetime dans une variable lorsque vous l'utilisez plusieurs fois, pour garantir qu'il n'y aura aucun problème vers minuit le dernier jour du mois. Donc: 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
C'est mieux car il garde le fuseau horaire.
Rosdi Kasim

8

Un peu tard à la fête mais voici une méthode d'extension qui a fait l'affaire pour moi

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

1
Le problème avec cela est qu'il ne conserve pas le fuseau horaire d'origine.
Mike Cole

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

Vous pouvez utiliser autre chose à la place de DateTime.


2

Je viens de créer des méthodes d'extension basées sur la réponse de Nick et d'autres sur le 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

Cela doit être efficace et correct:

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

ticks / TimeSpan.TicksPerDayRetourne ici le nombre de jours complets jusqu'à donné timeet - time.Day + 1réinitialise ce nombre au début du mois.


0

J'espère que cela vous aide.

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


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

3
C'est un double de la réponse de fubo, tu ne penses pas?
Thomas Ayoub

2
Bien que ce code puisse résoudre le problème, il est toujours encouragé à ajouter une explication expliquant pourquoi / comment cela fonctionne.
BDL

@ThomasAyoub - Non, ce n'est pas un double de la réponse de fubo car elle ne contiendra pas le portain de l'heure.
Jay Shah

@BDL - Je pense que c'est très simple à comprendre, ce qui ne nécessite aucune explication. Mais pour info, j'ai pris la date Utc actuelle, puis soustrait (Jours de la date actuelle - 1) pour obtenir la date de début du mois, c'est-à-dire 1 (pas 0 et c'est pourquoi j'ai soustrait 1). Et oui, cela résoudra définitivement le problème.
Jay Shah
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.