Comment changer l'heure dans DateTime?

353

Comment puis-je changer uniquement l'heure dans ma DateTimevariable "s"?

DateTime s = some datetime;
Santhosh
la source

Réponses:

598

Vous ne pouvez pas modifier une valeur DateTime - elle est immuable. Cependant, vous pouvez modifier la variable pour avoir une nouvelle valeur. La façon la plus simple de le faire pour modifier uniquement l'heure est de créer un TimeSpan avec l'heure appropriée et d'utiliser la propriété DateTime.Date:

DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;

s sera désormais la même date, mais à 10h30.

Notez que DateTimene tient pas compte des transitions d'heure d'été, représentant l'heure grégorienne «naïve» dans les deux sens (voir la section Remarques dans la DateTimedocumentation ). Les seules exceptions sont .Nowet .Today: elles récupèrent l'heure système actuelle qui reflète ces événements lorsqu'ils se produisent.

C'est le genre de chose qui m'a motivé à démarrer le projet Noda Time , qui est maintenant prêt pour la production. Son ZonedDateTimetype est rendu "conscient" en le liant à une tzentrée de base de données .

Jon Skeet
la source
11
s.Date.Add (nouveau TimeSpan (0, 0, 0)) devrait également fonctionner. L'utiliser pour annuler le temps lors de la vérification entre les jours.
Yogurt The Wise
8
@ user295734: Pourquoi appeleriez-vous en Addfournissant un intervalle de temps nul? Votre expression est équivalente s.Date, mais plus longue ...
Jon Skeet
J'ai oublié de le corriger, je l'ai réalisé après l'avoir mis dans le code, pour le mettre à zéro (ce que je cherchais à l'origine). Mais j'essayais juste de montrer comment obtenir un temps réglé sur une seule ligne, si ce n'est pas réglé sur 0.
Yogurt The Wise
3
Si vous avez 2 DateTimes, (un pour la date et un pour l'heure), vous pouvez le faire:var result = date.Date + time.TimeOfDay;
Zachary Yates
2
@ZacharyYates: Oui, même si je dirais qu'à ce stade, votre modèle est cassé pour commencer et timene devrait pas l'être DateTime. (J'utiliserais Noda Time bien sûr, mais ...)
Jon Skeet
100

D'accord, je plonge avec ma suggestion, une méthode d'extension:

public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds, int milliseconds)
{
    return new DateTime(
        dateTime.Year,
        dateTime.Month,
        dateTime.Day,
        hours,
        minutes,
        seconds,
        milliseconds,
        dateTime.Kind);
}

Appelez ensuite:

DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);

Il est important de noter que cette extension renvoie un nouvel objet date, vous ne pouvez donc pas le faire:

DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);

Mais vous pouvez le faire:

DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
joshcomley
la source
6
C'est essentiellement le même que Datetime.Today.Add(time.TimeOfDay). En effet, en interne, le constructeur n'effectue aucune correction basée sur le calendrier, à l'exception de la comptabilisation d'une année bissextile pour la partie date. C'est à dire DateTimeune implémentation "naïve" en termes de datetimemodule de Python .
ivan_pozdeev
68
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);

De cette façon, vous conservez votre date, tout en insérant une nouvelle partie heures, minutes et secondes à votre convenance.

Webleeuw
la source
@Webleeuw Bien sûr, une possibilité à distance d'une ArgumentOutOfRangeException en fonction des valeurs ajoutées. Voici un puzzle Pex qui le démontre.
lifebalance
Et selon le cas d'utilisation, peut également faire .AddMilliseconds()si nécessaire.
Broots Waymb
41

bon mot

var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));

ramènerait la date d'aujourd'hui avec une heure de 4:30:00, remplacer DateTime.Now par n'importe quel objet de date

Carl Woodhouse
la source
22

DateTime est un type immuable, vous ne pouvez donc pas changer .

Cependant, vous pouvez créer une nouvelle instance DateTime basée sur votre instance précédente. Dans votre cas, il semble que vous ayez besoin de la propriété Date, et vous pouvez ensuite ajouter un TimeSpan qui représente l'heure de la journée.

Quelque chose comme ça:

var newDt = s.Date + TimeSpan.FromHours(2);
Mark Seemann
la source
17

Si l'heure est déjà stockée dans un autre DateTimeobjet, vous pouvez utiliser la Addméthode.

DateTime dateToUse = DateTime.Now();
DateTime timeToUse = new DateTime(2012, 2, 4, 10, 15, 30); //10:15:30 AM

DateTime dateWithRightTime = dateToUse.Date.Add(timeToUse.TimeOfDay);

La TimeOfDaypropriété est un TimeSpanobjet et peut être transmise à la Addméthode. Et puisque nous utilisons la Datepropriété de la dateToUsevariable, nous obtenons juste la date et ajoutons l'intervalle de temps.

ShaneA
la source
16

Solution la plus simple:

DateTime s = //some Datetime that you want to change time for 8:36:44 ;
s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44);

Et si vous avez besoin d'un format de date et d'heure spécifique:

s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss");
Mr Rubix
la source
9
DateTime ts = DateTime.Now;
ts = new DateTime ( ts.Year, ts.Month, ts.Day, 0, 0, 0 ) ;
Console.WriteLine ( "Today = " + ts.ToString("M/dd/yy HH:mm:ss") ) ;

Exécuté: Aujourd'hui = 9/04/15 00:00:00

Philippe
la source
8

Je suis arrivé à ce poste alors que je cherchais la même fonctionnalité, cela pourrait éventuellement faire ce que le gars voulait. Prenez la date d'origine et remplacez la partie heure

DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");
BlackLarry
la source
4

Étant donné qu'il DateTimeest immuable, une nouvelle instance doit être créée lorsqu'un composant de date doit être modifié. Malheureusement, il n'y a pas de fonctionnalité intégrée pour définir les composants individuels d'unDateTime instance.

Utilisation des méthodes d'extension suivantes

public static DateTime SetPart(this DateTime dateTime, int? year, int? month, int? day, int? hour, int? minute, int? second)
{
    return new DateTime(
        year ?? dateTime.Year,
        month ?? dateTime.Month,
        day ?? dateTime.Day,
        hour ?? dateTime.Hour,
        minute ?? dateTime.Minute,
        second ?? dateTime.Second
    );
}

public static DateTime SetYear(this DateTime dateTime, int year)
{
    return dateTime.SetPart(year, null, null, null, null, null);
}

public static DateTime SetMonth(this DateTime dateTime, int month)
{
    return dateTime.SetPart(null, month, null, null, null, null);
}

public static DateTime SetDay(this DateTime dateTime, int day)
{
    return dateTime.SetPart(null, null, day, null, null, null);
}

public static DateTime SetHour(this DateTime dateTime, int hour)
{
    return dateTime.SetPart(null, null, null, hour, null, null);
}

public static DateTime SetMinute(this DateTime dateTime, int minute)
{
    return dateTime.SetPart(null, null, null, null, minute, null);
}

public static DateTime SetSecond(this DateTime dateTime, int second)
{
    return dateTime.SetPart(null, null, null, null, null, second);
}

vous pouvez définir des DateTimecomposants individuels comme

var now = DateTime.Now;

now.SetSecond(0);
solide
la source
3

Si vous avez un DateTime comme 2014/02/05 18:19:51 et que vous voulez juste 2014/02/05, vous pouvez le faire:

_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)
Cássio Alan Garcia
la source
3

L'ajout de .Date à votre date la définit à minuit (00:00).

MyDate.Date

Remarque Le SQL équivaval estCONVERT(DATETIME, CONVERT(DATE, @MyDate))

Ce qui rend cette méthode si bonne, c'est qu'elle est à la fois rapide à taper et facile à lire. Un bonus est qu'il n'y a pas de conversion à partir de chaînes.

C'est-à-dire pour régler la date d'aujourd'hui à 23h30, utilisez:

DateTime.Now.Date.AddHours(23).AddMinutes(30)

Vous pouvez bien sûr remplacer DateTime.Now ou MyDate par la date de votre choix.

WonderWorker
la source
3

En fait, vous ne pouvez pas changer l'heure une fois créée. Mais vous pouvez le créer facilement avec de nombreux constructeurs: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2

Par exemple, si vous voulez créer une seconde de changement de DateTime, vous pouvez simplement faire ceci:

DateTime now = DateTime.Now;
DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);
Francesc MP
la source
2
int year = 2012;
int month = 12;
int day = 24;
int hour = 0;
int min = 0;
int second = 23;
DateTime dt = new DateTime(year, month, day, hour, min, second);
Sagar Rawal
la source
2

Utilisez Date.Addet ajoutez un New TimeSpanavec la nouvelle heure que vous souhaitez ajouter

DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))
Yonatan Tuchinsky
la source
1

Lorsque vous construisez votre DateTimeobjet, utilisez un constructeur qui vous permet de spécifier l'heure:

var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42);  // 2000-01-01 13:37:42

Si vous avez déjà un DateTimeobjet et souhaitez changer l'heure, vous pouvez ajouter des minutes, des heures ou des secondes à votre en DateTimeutilisant des méthodes simples:

var myDateTime = new DateTime(2000, 01, 01);              // 2000-01-01 00:00:00
myDateTime = myDateTime.AddHours(13);                     // 2000-01-01 13:00:00
myDateTime = myDateTime.AddMinutes(37);                   // 2000-01-01 13:37:00
myDateTime = myDateTime.AddSecounds(42);                  // 2000-01-01 13:37:42

Remarquez comment nous devons «enregistrer» le résultat de chaque appel de méthode à la myDateTimevariable. En effet, le DateTimeest immuable et ses méthodes créent simplement de nouvelles instances avec les heures / minutes / secondes supplémentaires ajoutées.

Si vous devez ajouter à la fois des heures et des minutes (et / ou des secondes), vous pouvez simplifier le code en ajoutant un TimeSpanà l'original à la DateTimeplace:

var myDateTime = new DateTime(2000, 01, 01);              // 2000-01-01 00:00:00
myDateTime += new TimeSpan(13, 37, 42);                   // 2000-01-01 13:37:42

Si vous souhaitez définir des heures / minutes / secondes absolues, plutôt que d'ajouter aux valeurs existantes, vous pouvez utiliser le DateTimeconstructeur susmentionné et réutiliser les valeurs pour l'année / mois / jour antérieures:

myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
                          20, 33, 19)                     // 2000-01-01 20:33:19
Jørn Schou-Rode
la source
Ajouter et soustraire en utilisant les méthodes AddXXX
Chris Richner
1

Voici une méthode que vous pourriez utiliser pour le faire pour vous, utilisez-la comme ceci

DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0);

Voici la méthode, il y a probablement une meilleure façon, mais je viens de préparer ceci:

public enum DateTimePart { Years, Months, Days, Hours, Minutes, Seconds };
public DateTime ChangeDateTimePart(DateTime dt, DateTimePart part, int newValue)
{
    return new DateTime(
        part == DateTimePart.Years ? newValue : dt.Year,
        part == DateTimePart.Months ? newValue : dt.Month,
        part == DateTimePart.Days ? newValue : dt.Day,
        part == DateTimePart.Hours ? newValue : dt.Hour,
        part == DateTimePart.Minutes ? newValue : dt.Minute,
        part == DateTimePart.Seconds ? newValue : dt.Second
        );
}
naspinski
la source
1

Je viens de rencontrer ce message parce que j'avais un problème similaire où je voulais définir l'heure pour un objet Entity Framework dans MVC qui obtient la date à partir d'une vue (datepicker) de sorte que le composant heure est 00:00:00 mais j'ai besoin ce sera l'heure actuelle. Sur la base des réponses dans ce post, j'ai trouvé:

myEntity.FromDate += DateTime.Now.TimeOfDay;
Rob
la source
1
//The fastest way to copy time            

DateTime justDate = new DateTime(2011, 1, 1); // 1/1/2011 12:00:00AM the date you will be adding time to, time ticks = 0
DateTime timeSource = new DateTime(1999, 2, 4, 10, 15, 30); // 2/4/1999 10:15:30AM - time tick = x

justDate = new DateTime(justDate.Date.Ticks + timeSource.TimeOfDay.Ticks);

Console.WriteLine(justDate); // 1/1/2011 10:15:30AM
Console.Read();
Pawel Cioch
la source
1

Vous pouvez attribuer une valeur initiale à une nouvelle DateTimevaleur de différentes manières:

  • Méthode d'extension

Méthode d'extension DateTime

    public static DateTime ChangeTime(this DateTime dateTime, int hours, int minutes, int seconds = default, int milliseconds = default)
    {
        return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, hours, minutes, seconds, milliseconds, dateTime.Kind);
    }

puis en utilisant ChangeTime:

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.ChangeTime(12, 20, 10);
  • en utilisant les méthodes Add

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
  • en utilisant le Timespan

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
  • en utilisant la valeur initiale

    DateTime datetime = DateTime.Now;
    datetime = new DateTime(datetime.Year, datetime.Month, datetime.Day, 12, 20, 10);
Reza Jenabi
la source
0

Quel est le problème avec la méthode DateTime.AddSeconds où vous pouvez ajouter ou soustraire des secondes?

Chris Richner
la source
Non seulement cela, mais cela ne semble pas répondre à la question de toute façon. Je soupçonne que l'OP veut un DateTime avec la même date mais une heure spécifique - ce qui serait relativement difficile à faire en utilisant simplement AddSeconds.
Jon Skeet
0
  DateTime s;
//s = datevalue
                s = s.AddMilliseconds(10);
                s = s.AddMinutes(10);
                s = s.AddSeconds(10);
                s = s.AddHours(10);

vous pouvez ajouter des valeurs + ve / -ve dans le paramètre.

s.Add(new TimeSpan(1, 1, 1));
Sarre
la source
@ Jon: J'ai commenté la ligne. l'utilisateur doit attribuer une valeur avant d'utiliser ce code.
Sarre
@Saar: Plus important encore, vous avez à présent ajouté les affectations à s (à l'exception de l'appel à s.Add (...)).
Jon Skeet
@ Jon: J'ai appris ma leçon. Merci pour votre gentillesse et votre temps. Je le pense vraiment.
Sarre
0

Cela ne résout-il pas vos problèmes ??

Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);
Naveed Butt
la source
0

Je préfère ça:

DateTime s = //get some datetime;
s = new DateTime(s.Year, s.Month,s.Day,s.Hour,s.Minute,0);
andrew
la source
0
 Using an extencion to DateTime:  

        public enum eTimeFragment
        {
            hours,
            minutes,
            seconds,
            milliseconds
        }
        public static DateTime ClearTimeFrom(this DateTime dateToClear, eTimeFragment etf)
        {
            DateTime dtRet = dateToClear;
            switch (etf)
            {
                case eTimeFragment.hours:
                    dtRet = dateToClear.Date;
                    break;
                case eTimeFragment.minutes:
                    dtRet = dateToClear.AddMinutes(dateToClear.Minute * -1);
                    dtRet = dtRet.ClearTimeFrom(eTimeFragment.seconds);
                    break;
                case eTimeFragment.seconds:
                    dtRet = dateToClear.AddSeconds(dateToClear.Second * -1);
                    dtRet = dtRet.ClearTimeFrom(eTimeFragment.milliseconds);
                    break;
                case eTimeFragment.milliseconds:
                    dtRet = dateToClear.AddMilliseconds(dateToClear.Millisecond * -1);
                    break;
            }
            return dtRet;

        }

Utilisez comme ceci:

Console.WriteLine (DateTime.Now.ClearTimeFrom (eTimeFragment.hours))

cela doit retourner: 2016-06-06 00: 00: 00.000

Ricardo Figueiredo
la source
-1

La meilleure solution est:

currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
Mahesh Alwani
la source
1
Au début, je pensais que c'était faux, mais cela a du sens si vous affectez le résultat à un objet DateTime. Ce n'est cependant pas la meilleure solution. Cela vous oblige à connaître la partie Heure actuelle afin de faire les calculs corrects, tout en prenant la partie Date de la date et en y ajoutant la meilleure.
ThunderGr
1
Certainement pas "le meilleur". Loin d'être lisible et à usage répétitif d'un nombre magique.
BartoszKP
-1

Essaye celui-là

var NewDate = Convert.ToDateTime(DateTime.Now.ToString("dd/MMM/yyyy")+" "+"10:15 PM")/*Add your time here*/;
Vicky
la source
-5

voici une façon ghetto, mais ça marche :)

DateTime dt = DateTime.Now; //get a DateTime variable for the example
string newSecondsValue = "00";
dt = Convert.ToDateTime(dt.ToString("MM/dd/yyyy hh:mm:" + newSecondsValue));
naspinski
la source
Une autre manière de ghetto mais un peu plus propre serait de simplement jouer avec les secondes. par exemple, dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)mais je ne le recommanderais pas.
Mike