web-dev-qa-db-fra.com

Comment changer l'heure dans DateTime?

Comment puis-je modifier uniquement l'heure dans ma variable DateTime "s"?

DateTime s = some datetime;
319
Santhosh

Vous ne pouvez pas changer une valeur DateTime - elle est immuable. Cependant, vous pouvez changer la variable pour avoir une nouvelle valeur. Le moyen le plus simple de modifier simplement l'heure consiste à créer un TimeSpan avec l'heure appropriée et à utiliser la propriété DateTime.Date:

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

s sera maintenant la même date, mais à 10h30.

Notez que DateTime ignore les transitions d’heure d’été, représentant le temps "naïf" grégorien dans les deux sens (voir la section Remarques de la section DateTime docs ). Les seules exceptions sont .Now et .Today: ils récupèrent l'heure système en cours 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 type ZonedDateTime est rendu "conscient" en le liant à une entrée de base de données tz .

543
Jon Skeet

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);
}

Puis appelez:

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

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

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

Mais vous pouvez faire ceci:

DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
90
joshcomley
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);

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

64
Webleeuw

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, remplace DateTime.Now par un objet de date

31
Carl Woodhouse

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

Toutefois, 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 du jour.

Quelque chose comme ça:

var newDt = s.Date + TimeSpan.FromHours(2);
20
Mark Seemann

Si vous avez déjà enregistré l'heure dans un autre objet DateTime, vous pouvez utiliser la méthode Add.

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 propriété TimeOfDay est un objet TimeSpan et peut être transmise à la méthode Add. Et comme nous utilisons la propriété Date de la variable dateToUse, nous obtenons uniquement la date et ajoutons la période.

15
ShaneA

La 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");
12
Mr Rubix
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

9
philip

Arrivé sur ce post alors que je cherchais la même fonctionnalité, cela pourrait 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");
8
BlackLarry

En fait, vous ne pouvez pas changer l'heure une fois qu'elle est 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 un DateTime changeant de seconde, vous pouvez simplement faire ceci:

DateTime now = DateTime.Now;
DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);
3
Francesc MP

L'ajout de .Date à votre date la règle à minuit (00:00).

MyDate.Date

Note Le SQL équivalent est CONVERT(DATETIME, CONVERT(DATE, @MyDate))

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

C'est à dire. Pour définir la date du jour à 23h30, utilisez:

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

Vous pouvez bien sûr remplacer DateTime.Now ou MyDate par n’importe quelle date de votre choix.

3

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

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

Utilisez Date.Add et ajoutez un New TimeSpan avec la nouvelle heure que vous souhaitez ajouter.

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

Puisque DateTime est immuable, une nouvelle instance doit être créée lorsqu'un composant de date doit être modifié. Malheureusement, aucune fonctionnalité intégrée ne permet de définir les composants individuels d'une instance DateTime.

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 composants individuels DateTime comme

var now = DateTime.Now;

now.SetSecond(0);
2
solidsparrow
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);
2
Sagar Rawal

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 fouiller 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
        );
}
1
naspinski
//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();
1
Pawel Cioch

Je viens de tomber sur ce message car j'avais un problème similaire. Je voulais définir l'heure d'un objet Entity Framework dans MVC qui obtient la date d'une vue (datepicker). Le composant heure est donc 00:00:00, mais j'ai besoin de c'est l'heure actuelle. Basé sur les réponses dans ce post, je suis venu avec:

myEntity.FromDate += DateTime.Now.TimeOfDay;
1
Rob

Je préfère ça:

DateTime s = //get some datetime;
s = new DateTime(s.Year, s.Month,s.Day,s.Hour,s.Minute,0);
0
andrew
 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: 06/06/2016 00: 00: 00.000

0

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

0
Chris Richner

Lorsque vous construisez votre objet DateTime, utilisez un constructeur qui vous permet de spécifier le temps:

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

Si vous avez déjà un objet DateTime et souhaitez modifier l'heure, vous pouvez ajouter des minutes, des heures ou des secondes à votre DateTime à l'aide de 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 variable myDateTime. En effet, la DateTime est immuable et ses méthodes créent simplement de nouvelles instances avec les heures/minutes/secondes supplémentaires ajoutées.

Si vous devez ajouter les heures et les minutes (et/ou les secondes) et la même heure, vous pouvez simplifier le code en ajoutant un TimeSpan à l'original DateTime à la place:

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 des valeurs existantes, vous pouvez utiliser le constructeur DateTime susmentionné et réutiliser les valeurs pour l'année, le mois ou le jour à partir de:

myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
                          20, 33, 19)                     // 2000-01-01 20:33:19
0
Jørn Schou-Rode

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

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