Odpowiedzi:
Nie można zmienić wartości DateTime - jest ona niezmienna. Można jednak zmienić zmienną, aby miała nową wartość. Najłatwiejszym sposobem na zmianę tego czasu jest utworzenie TimeSpan z odpowiednim czasem i użycie właściwości DateTime.Date:
DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
s
będzie teraz tego samego dnia, ale o 10:30.
Zwróć uwagę, że DateTime
pomija zmiany czasu letniego, reprezentując „naiwny” czas gregoriański w obu kierunkach (patrz sekcja Uwagi w DateTime
dokumentacji ). Jedynymi wyjątkami są : .Now
i .Today
pobierają bieżący czas systemowy, który odzwierciedla te zdarzenia w momencie ich wystąpienia.
Właśnie to zmotywowało mnie do rozpoczęcia projektu Noda Time , który jest teraz gotowy do produkcji. Jego ZonedDateTime
typ jest „świadomy” poprzez połączenie go z tz
pozycją bazy danych .
Add
podając zerowy przedział czasu? Twoje wyrażenie jest równoważne s.Date
, ale dłuższe ...
DateTime
s (jeden na randkę, a drugi na czas), możesz to zrobić:var result = date.Date + time.TimeOfDay;
time
nie powinien byćDateTime
. (Oczywiście użyłbym Nody Time, ale ...)
Dobra, nurkuję z moją sugestią, metodą przedłużenia:
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);
}
Wtedy zadzwoń:
DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);
Należy zauważyć, że to rozszerzenie zwraca nowy obiekt daty, więc nie można tego zrobić:
DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);
Ale możesz to zrobić:
DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
Datetime.Today.Add(time.TimeOfDay)
. Jest tak, ponieważ wewnętrznie konstruktor nie dokonuje żadnych korekt opartych na kalendarzu, z wyjątkiem rozliczenia roku przestępnego dla części daty. Tj. DateTime
Jest „naiwną” implementacją pod względem datetime
modułu Pythona .
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
W ten sposób zachowujesz swoją datę, a jednocześnie wstawiasz nowe godziny, minuty i sekundy według własnych upodobań.
.AddMilliseconds()
razie potrzeby.
jedna wkładka
var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));
przywróci dzisiejszą datę o godzinie 4:30:00, zastąpię DateTime.Now dowolnym obiektem daty
DateTime jest niezmiennym typem, więc nie możesz go zmienić .
Można jednak utworzyć nową instancję DateTime na podstawie poprzedniej instancji. W twoim przypadku wygląda na to, że potrzebujesz właściwości Date, a następnie możesz dodać TimeSpan reprezentujący porę dnia.
Coś takiego:
var newDt = s.Date + TimeSpan.FromHours(2);
Jeśli masz już czas przechowywany w innym DateTime
obiekcie, możesz użyć tej Add
metody.
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);
TimeOfDay
Nieruchomość jest TimeSpan
przedmiotem i może zostać przekazany do Add
metody. A ponieważ korzystamy z Date
właściwości dateToUse
zmiennej, otrzymujemy tylko datę i dodajemy przedział czasu.
Najprostsze rozwiązanie:
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);
A jeśli potrzebujesz określonego formatu daty i godziny:
s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss");
Stało się to w tym poście, gdy szukałem tej samej funkcjonalności, która mogłaby zrobić to, czego chciał facet. Weź pierwotną datę i zastąp część czasu
DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");
Ponieważ DateTime
jest to niezmienne, należy utworzyć nową instancję, gdy należy zmienić komponent daty. Niestety nie ma wbudowanej funkcjonalności do ustawiania poszczególnych komponentówDateTime
instancji.
Korzystanie z następujących metod rozszerzenia
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);
}
możesz ustawić poszczególne DateTime
elementy, takie jak
var now = DateTime.Now;
now.SetSecond(0);
Jeśli masz DateTime, taki jak 2014/02/05 18:19:51 i chcesz tylko 2014/02/05, możesz to zrobić:
_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)
Dodanie .Date do daty ustawia ją na północ (00:00).
MyDate.Date
Uwaga Równoważny SQL toCONVERT(DATETIME, CONVERT(DATE, @MyDate))
Tym, co czyni tę metodę tak dobrą, jest to, że można ją szybko pisać i jest łatwa do odczytania. Bonusem jest to, że nie ma konwersji z ciągów.
To znaczy Aby ustawić dzisiejszą datę na 23:30, użyj:
DateTime.Now.Date.AddHours(23).AddMinutes(30)
Możesz oczywiście zastąpić DateTime.Now lub MyDate dowolną wybraną datą.
W rzeczywistości nie można zmienić czasu po jego utworzeniu. Ale możesz go łatwo utworzyć za pomocą wielu konstruktorów: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2
Na przykład, jeśli chcesz utworzyć DateTime zmieniający sekundy, możesz po prostu to zrobić:
DateTime now = DateTime.Now;
DateTime secondschanged = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, yourseconds);
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);
Użyj Date.Add
i dodaj New TimeSpan
nowy czas, który chcesz dodać
DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))
Podczas konstruowania DateTime
obiektu użyj konstruktora, który pozwala określić czas:
var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42); // 2000-01-01 13:37:42
Jeśli masz już DateTime
obiekt i chcesz zmienić czas, możesz dodać minuty, godziny lub sekundy DateTime
za pomocą prostych metod:
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
Zauważ, jak musimy „zapisać” wynik każdego wywołania metody do myDateTime
zmiennej. Wynika to z faktu, że DateTime
jest niezmienny, a jego metody po prostu tworzą nowe wystąpienia z dodanymi dodatkowymi godzinami / minutami / sekundami.
Jeśli chcesz dodać godziny i minuty (i / lub sekundy) i jednocześnie, możesz uprościć kod, dodając TimeSpan
DateTime
zamiast tego oryginał :
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
Jeśli chcesz ustawić bezwzględne godziny / minuty / sekundy, zamiast dodawać do istniejących wartości, możesz użyć wyżej wspomnianego DateTime
konstruktora i ponownie użyć wartości dla roku / miesiąca / dnia wcześniej:
myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
20, 33, 19) // 2000-01-01 20:33:19
Oto metoda, której możesz użyć, aby zrobić to za Ciebie, użyj jej w ten sposób
DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0);
Oto metoda, prawdopodobnie jest lepszy sposób, ale właśnie to wymyśliłem:
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
);
}
Właśnie natrafiłem na ten post, ponieważ miałem podobny problem, w którym chciałem ustawić czas dla obiektu Entity Framework w MVC, który pobiera datę z widoku (datepicker), więc komponent czasu to 00:00:00, ale potrzebuję to aktualny czas. Na podstawie odpowiedzi w tym poście wymyśliłem:
myEntity.FromDate += DateTime.Now.TimeOfDay;
//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();
Możesz przypisać wartość początkową do nowej DateTime
wartości na wiele różnych sposobów:
Metoda przedłużenia 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);
}
następnie używając ChangeTime
:
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.ChangeTime(12, 20, 10);
za pomocą metod Dodaj
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
za pomocą przedziału czasu
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
przy użyciu wartości początkowej
DateTime datetime = DateTime.Now;
datetime = new DateTime(datetime.Year, datetime.Month, datetime.Day, 12, 20, 10);
Co jest złego w metodzie DateTime.AddSeconds, w której można dodawać lub odejmować sekundy?
DateTime s;
//s = datevalue
s = s.AddMilliseconds(10);
s = s.AddMinutes(10);
s = s.AddSeconds(10);
s = s.AddHours(10);
możesz dodać wartości + ve / -ve w parametrze.
s.Add(new TimeSpan(1, 1, 1));
Czy to nie rozwiązuje twoich problemów?
Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);
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;
}
Użyj w ten sposób:
Console.WriteLine (DateTime.Now.ClearTimeFrom (eTimeFragment.hours))
to musi zwrócić: 2016-06-06 00: 00: 00.000
Najlepszym rozwiązaniem jest:
currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
tutaj jest getto, ale działa :)
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));
dt.AddSeconds(0-dt.Seconds).AddSeconds(newSecondsValue)
ale nie poleciłbym tego.