Comment puis-je modifier uniquement l'heure dans ma variable DateTime
"s"?
DateTime s = some datetime;
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
.
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);
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.
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
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);
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.
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");
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
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");
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);
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.
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)
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))
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);
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);
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
);
}
//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();
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;
Je préfère ça:
DateTime s = //get some datetime;
s = new DateTime(s.Year, s.Month,s.Day,s.Hour,s.Minute,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: 06/06/2016 00: 00: 00.000
Quel est le problème avec la méthode DateTime.AddSeconds où vous pouvez ajouter ou soustraire des secondes?
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
Cela ne résout-il pas vos problèmes?
Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);