Wie ändere ich die Zeit in DateTime?

353

Wie kann ich nur die Zeit in meiner DateTimeVariablen "s" ändern ?

DateTime s = some datetime;
Santhosh
quelle

Antworten:

598

Sie können einen DateTime-Wert nicht ändern - er ist unveränderlich. Sie können die Variable jedoch so ändern, dass sie einen neuen Wert hat. Der einfachste Weg, dies zu tun, um nur die Zeit zu ändern, besteht darin, eine Zeitspanne mit der relevanten Zeit zu erstellen und die DateTime.Date-Eigenschaft zu verwenden:

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

s wird jetzt das gleiche Datum sein, aber um 10.30 Uhr.

Beachten Sie, dass DateTimeSommerzeitübergänge nicht berücksichtigt werden, die die "naive" Gregorianische Zeit in beide Richtungen darstellen (siehe Abschnitt "Anmerkungen" in den DateTimeDokumenten ). Die einzigen Ausnahmen sind .Nowund .Today: Sie rufen die aktuelle Systemzeit ab, die diese Ereignisse widerspiegelt, sobald sie auftreten.

Dies hat mich motiviert, das Noda Time- Projekt zu starten , das jetzt produktionsbereit ist. Sein ZonedDateTimeTyp wird "bekannt gemacht", indem er mit einem tzDatenbankeintrag verknüpft wird .

Jon Skeet
quelle
11
s.Date.Add (neue Zeitspanne (0, 0, 0)) sollte ebenfalls funktionieren. Verwenden Sie diese Option, um die Zeit beim Überprüfen zwischen Tagen auf Null zu setzen.
Joghurt der Weise
8
@ user295734: Warum sollten Sie die AddBereitstellung einer Zeitspanne von Null anrufen? Ihr Ausdruck ist gleichbedeutend mit s.Date, aber länger ...
Jon Skeet
Ich habe vergessen, es zu korrigieren, habe es erkannt, nachdem ich es in den Code eingefügt habe, um es auf Null zu setzen (wonach ich ursprünglich gesucht habe). Aber ich habe nur versucht zu zeigen, wie man eine Zeit in einer Zeile
festlegt
3
Wenn Sie 2 DateTimes haben (eine für das Datum und eine für die Uhrzeit), können Sie dies tun:var result = date.Date + time.TimeOfDay;
Zachary Yates
2
@ZacharyYates: Ja, obwohl ich argumentieren würde, dass Ihr Modell zu diesem Zeitpunkt zunächst kaputt ist und timekein Modell sein sollte DateTime. (Ich würde natürlich Noda Time verwenden, aber ...)
Jon Skeet
100

Okay, ich tauche mit meinem Vorschlag ein, einer Erweiterungsmethode:

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

Dann ruf an:

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

Es ist wichtig zu beachten, dass diese Erweiterung ein neues Datumsobjekt zurückgibt. Sie können dies also nicht tun:

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

Aber Sie können dies tun:

DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
Joshcomley
quelle
6
Dies ist im Wesentlichen das gleiche wie Datetime.Today.Add(time.TimeOfDay). Dies liegt daran, dass der Konstruktor intern keine kalenderbasierten Korrekturen vornimmt, außer dass ein Schaltjahr für den Datumsteil berücksichtigt wird. Dh DateTimeist eine "naive" Implementierung in Bezug auf Pythons datetimeModul.
ivan_pozdeev
68
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);

Auf diese Weise behalten Sie Ihr Datum bei, während Sie einen neuen Stunden-, Minuten- und Sekunden-Teil nach Ihren Wünschen einfügen.

Webleeuw
quelle
@Webleeuw Natürlich eine entfernte Möglichkeit einer ArgumentOutOfRangeException in Abhängigkeit von den hinzugefügten Werten. Hier ist ein Pex- Puzzle, das dies demonstriert.
Lebensbalance
Und je nach Anwendungsfall auch .AddMilliseconds()bei Bedarf.
Broots Waymb
40

Einzeiler

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

würde das heutige Datum mit einer Zeit von 4:30:00 zurückbringen, DateTime.Now durch ein beliebiges Datumsobjekt ersetzen

Carl Woodhouse
quelle
22

DateTime ist ein unveränderlicher Typ, daher können Sie ihn nicht ändern .

Sie können jedoch eine neue DateTime-Instanz basierend auf Ihrer vorherigen Instanz erstellen. In Ihrem Fall scheint es so, als ob Sie die Date-Eigenschaft benötigen, und Sie können dann eine Zeitspanne hinzufügen, die die Tageszeit darstellt.

Etwas wie das:

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

Wenn Sie die Zeit bereits in einem anderen DateTimeObjekt gespeichert haben , können Sie die AddMethode verwenden.

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

Die TimeOfDayEigenschaft ist ein TimeSpanObjekt und kann an die AddMethode übergeben werden. Und da wir die DateEigenschaft der dateToUseVariablen verwenden, erhalten wir nur das Datum und fügen die Zeitspanne hinzu.

ShaneA
quelle
16

Einfachste Lösung:

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

Und wenn Sie ein bestimmtes Datums- und Uhrzeitformat benötigen:

s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss");
Herr Rubix
quelle
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") ) ;

Ausgeführt: Heute = 9/04/15 00:00:00

philip
quelle
8

Geschah bei diesem Beitrag, als ich nach der gleichen Funktionalität suchte, die möglicherweise das tun könnte, was der Typ wollte. Nehmen Sie das ursprüngliche Datum und ersetzen Sie den Zeitteil

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

Da DateTimeunveränderlich ist, muss eine neue Instanz erstellt werden, wenn eine Datumskomponente geändert werden muss. Leider gibt es keine integrierte Funktionalität zum Festlegen einzelner Komponenten einer DateTimeInstanz.

Verwenden der folgenden Erweiterungsmethoden

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

Sie können einzelne DateTimeKomponenten wie einstellen

var now = DateTime.Now;

now.SetSecond(0);
fester Spatz
quelle
3

Wenn Sie eine DateTime wie 2014/02/05 18:19:51 haben und nur 2014/02/05 möchten, können Sie dies tun:

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

Durch Hinzufügen von .Date zu Ihrem Datum wird Mitternacht (00:00) festgelegt.

MyDate.Date

Hinweis Das äquivavalente SQL istCONVERT(DATETIME, CONVERT(DATE, @MyDate))

Was diese Methode so gut macht, ist, dass sie sowohl schnell zu tippen als auch leicht zu lesen ist. Ein Bonus ist, dass es keine Konvertierung von Strings gibt.

Dh Um das heutige Datum auf 23:30 Uhr einzustellen, verwenden Sie:

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

Sie können DateTime.Now oder MyDate natürlich durch ein beliebiges Datum Ihrer Wahl ersetzen.

WonderWorker
quelle
3

Tatsächlich können Sie die Uhrzeit nach ihrer Erstellung nicht mehr ändern. Sie können es jedoch problemlos mit vielen Konstruktoren erstellen: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2

Wenn Sie beispielsweise eine DateTime erstellen möchten, die Sekunden ändert, können Sie dies einfach tun:

DateTime now = DateTime.Now;
DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);
Francesc MP
quelle
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
quelle
2

Verwenden Sie Date.Addund fügen Sie ein New TimeSpanmit der neuen Zeit hinzu, die Sie hinzufügen möchten

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

DateTimeVerwenden Sie beim Erstellen Ihres Objekts einen Konstruktor, mit dem Sie die Zeit angeben können:

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

Wenn Sie bereits ein DateTimeObjekt haben und die Zeit ändern möchten, können Sie DateTimemit einfachen Methoden Minuten, Stunden oder Sekunden hinzufügen :

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

Beachten Sie, wie wir das Ergebnis jedes Methodenaufrufs an die myDateTimeVariable "speichern" müssen . Dies liegt daran, dass das DateTimeunveränderlich ist und seine Methoden einfach neue Instanzen mit den zusätzlichen Stunden / Minuten / Sekunden erstellen.

Wenn Sie sowohl Stunden als auch Minuten (und / oder Sekunden) und dieselbe Zeit hinzufügen müssen, können Sie den Code vereinfachen, indem Sie stattdessen TimeSpandem Original ein hinzufügen DateTime:

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

Wenn Sie absolute Stunden / Minuten / Sekunden festlegen möchten, anstatt die vorhandenen Werte zu ergänzen, können Sie den oben genannten DateTimeKonstruktor verwenden und Werte für Jahr / Monat / Tag von früher wiederverwenden:

myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
                          20, 33, 19)                     // 2000-01-01 20:33:19
Jørn Schou-Rode
quelle
Addiere und subtrahiere mit den AddXXX-Methoden
Chris Richner
1

Hier ist eine Methode, mit der Sie es für Sie tun können. Verwenden Sie es so

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

Hier ist die Methode, es gibt wahrscheinlich einen besseren Weg, aber ich habe das gerade ausgepeitscht:

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
quelle
1

Ich bin gerade auf diesen Beitrag gestoßen, weil ich ein ähnliches Problem hatte, bei dem ich die Zeit für ein Entity Framework-Objekt in MVC festlegen wollte, das das Datum aus einer Ansicht (Datumsauswahl) abruft, sodass die Zeitkomponente 00:00:00 ist, aber ich brauche es soll die aktuelle Zeit sein. Basierend auf den Antworten in diesem Beitrag habe ich Folgendes gefunden:

myEntity.FromDate += DateTime.Now.TimeOfDay;
rauben
quelle
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
quelle
1

Sie können einem neuen DateTimeWert auf viele verschiedene Arten einen Anfangswert zuweisen :

  • Erweiterungsmethode

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

dann mit ChangeTime:

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.ChangeTime(12, 20, 10);
  • mit den Add-Methoden

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
  • mit der Zeitspanne

    DateTime datetime = DateTime.Now; //Your DateTime
    datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
  • mit Anfangswert

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

Was ist falsch an der DateTime.AddSeconds-Methode, mit der Sie Sekunden hinzufügen oder entfernen können?

Chris Richner
quelle
Nicht nur das, es klingt auch nicht so, als würde es die Frage beantworten. Ich vermute, das OP möchte eine DateTime mit demselben Datum, aber einer bestimmten Zeit - was mit AddSeconds relativ schwierig wäre.
Jon Skeet
0
  DateTime s;
//s = datevalue
                s = s.AddMilliseconds(10);
                s = s.AddMinutes(10);
                s = s.AddSeconds(10);
                s = s.AddHours(10);

Sie können dem Parameter + ve / -ve Werte hinzufügen.

s.Add(new TimeSpan(1, 1, 1));
Saar
quelle
@ Jon: Ich habe die Zeile kommentiert. Der Benutzer muss einen Wert zuweisen, bevor er diesen Code verwenden kann.
Saar
@Saar: Noch wichtiger ist, dass Sie die Zuweisungen jetzt wieder zu s hinzugefügt haben (mit Ausnahme des Aufrufs von s.Add (...)).
Jon Skeet
@ Jon: Ich habe meine Lektion gelernt. Vielen Dank für Ihre Freundlichkeit und Zeit. Ich meine es ernst.
Saar
0

Behebt das nicht deine Probleme?

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

Ich bevorzuge das:

DateTime s = //get some datetime;
s = new DateTime(s.Year, s.Month,s.Day,s.Hour,s.Minute,0);
Andrew
quelle
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;

        }

Verwenden Sie wie folgt:

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

Dies muss zurückkehren: 2016-06-06 00: 00: 00.000

Ricardo Figueiredo
quelle
-1

Die beste Lösung ist:

currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
Mahesh Alwani
quelle
1
Zuerst dachte ich, das sei falsch, aber es ist sinnvoll, wenn Sie das Ergebnis einem DateTime-Objekt zuweisen. Es ist jedoch nicht die beste Lösung. Sie müssen den aktuellen Zeitanteil kennen, um die richtigen Berechnungen durchführen zu können, während Sie den Datumsanteil des Datums nehmen und dort den besten hinzufügen.
ThunderGr
1
Auf keinen Fall "am besten". Weit davon entfernt, lesbar zu sein und eine magische Zahl wiederholt zu verwenden.
BartoszKP
-1

Probier diese

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

Hier ist ein Ghetto Weg, aber es funktioniert :)

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
quelle
Ein anderer Ghetto-Weg, aber ein bisschen sauberer, wäre, nur mit den Sekunden zu spielen. zB dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)würde es aber nicht empfehlen.
Mike