Відповіді:
Ви не можете змінити значення DateTime - воно незмінне. Однак ви можете змінити змінну, щоб мати нове значення. Найпростіший спосіб змінити саме час - це створити TimeSpan з відповідним часом і використовувати властивість DateTime.Date:
DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
s
тепер буде та сама дата, але о 10.30 ранку.
Зауважте, що DateTime
нехтуєте переходами літнього часу, що представляють "наївний" григоріанський час в обох напрямках (див. Розділ "Зауваження" в DateTime
документах ). Виняток становить лише .Now
та .Today
: вони отримати поточний системний час , яке відображає ці події , як вони відбуваються.
Саме така річ мотивувала мене розпочати проект Noda Time , який зараз готовий до виробництва. Її ZonedDateTime
тип стає "відомим" , пов'язуючи його із записом tz
бази даних .
Add
надавати нульовий проміжок часу? Ваше вираження рівносильно s.Date
, але довше ...
DateTime
с (один на побачення і один на час), ви можете зробити це:var result = date.Date + time.TimeOfDay;
time
не повинна бути DateTime
. (Я б використовував Noda Time, звичайно, але ...)
Добре, я занурююсь із своєю пропозицією, методом розширення:
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);
}
Потім зателефонуйте:
DateTime myDate = DateTime.Now.ChangeTime(10,10,10,0);
Важливо зазначити, що це розширення повертає новий об'єкт дати, тому ви не можете цього зробити:
DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);
Але ви можете це зробити:
DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
Datetime.Today.Add(time.TimeOfDay)
. Це тому, що внутрішньо конструктор не робить ніяких виправлень на основі календаря, за винятком обліку високосного року для частини дати. Тобто DateTime
це "наївна" реалізація з точки зору datetime
модуля Python .
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
Таким чином ви зберігаєте свою дату, вставляючи при цьому нову частину годин, хвилин та секунд на свій смак.
.AddMilliseconds()
при необхідності.
один лайнер
var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));
поверне сьогоднішню дату з часом 4:30:00, замінить DateTime.Зараз будь-яким об’єктом дати
DateTime - це непорушний тип, тому ви не можете його змінити .
Однак ви можете створити новий екземпляр DateTime на основі попереднього примірника. У вашому випадку це здається, що вам потрібна властивість Date, і ви можете додати TimeSpan, який представляє час доби.
Щось на зразок цього:
var newDt = s.Date + TimeSpan.FromHours(2);
Якщо у вас вже є час, що зберігається в іншому DateTime
об'єкті, ви можете скористатися 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);
TimeOfDay
Властивість є TimeSpan
об'єктом і може бути переданий Add
методу. А оскільки ми використовуємо Date
властивість dateToUse
змінної, ми отримуємо просто дату та додаємо проміжок часу.
Найпростіше рішення:
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);
А якщо вам потрібен певний формат дати та часу:
s = new DateTime(s.Year, s.Month, s.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss");
Це сталося, коли я шукав ту саму функціональність, яка, можливо, могла б зробити те, що хотів хлопець. Візьміть початкову дату та замініть частину часу
DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");
Оскільки DateTime
є незмінним, слід створити новий екземпляр, коли потрібно змінити компонент дати. На жаль, не існує вбудованої функціональності для встановлення окремих компонентівDateTime
екземпляра.
Використання наступних методів розширення
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);
}
ви можете встановити окремі DateTime
компоненти, як
var now = DateTime.Now;
now.SetSecond(0);
Якщо у вас є така дата, як 2014/02/05 18:19:51, і ви хочете просто 2014/02/05, ви можете зробити це:
_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)
Додавання .Дати до дати визначає її опівночі (00:00).
MyDate.Date
Примітка Еквівалентний SQL єCONVERT(DATETIME, CONVERT(DATE, @MyDate))
Що робить цей метод настільки хорошим, це те, що він одночасно швидко набирається та легко читається. Бонусом є те, що не відбувається перетворення рядків.
Тобто Щоб встановити сьогоднішню дату на 23:30, використовуйте:
DateTime.Now.Date.AddHours(23).AddMinutes(30)
Звичайно, ви можете замінити DateTime.Now або MyDate на будь-яку бажану дату.
Насправді ви не можете змінити час, коли він створений. Але ви можете легко створити його за допомогою багатьох конструкторів: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2
Наприклад, якщо ви хочете створити DateTime, що змінюється секундами, ви можете просто зробити це:
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);
Використовуйте Date.Add
та додайте New TimeSpan
нове час, яке ви хочете додати
DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))
Створюючи DateTime
об'єкт, використовуйте конструктор, який дозволяє задавати час:
var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42); // 2000-01-01 13:37:42
Якщо у вас вже є DateTime
об’єкт і хочете змінити час, uou може додати хвилини, години або секунди до своїх, DateTime
використовуючи прості методи:
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
Зауважте, як нам потрібно "зберегти" результат від кожного виклику методу до myDateTime
змінної. Це пояснюється тим, що DateTime
функція непорушна, і її методи просто створюють нові екземпляри з додаванням додаткових годин / хвилин / секунд.
Якщо вам потрібно додати і години, і хвилини (і / або секунди), і той самий час, ви можете спростити код, додавши замість TimeSpan
оригіналу a 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
Якщо ви хочете встановити абсолютні години / мінуси / секунди, а не додавати до існуючих значень, ви можете використовувати вищезгаданий DateTime
конструктор і повторно використовувати значення для року / місяця / дня з попереднього:
myDateTime = new DateTime(myDateTime.Year, myDateTime.Month, myDateTime.Day,
20, 33, 19) // 2000-01-01 20:33:19
Ось метод, який ви можете використати, щоб зробити це для вас, використовуйте його так
DateTime newDataTime = ChangeDateTimePart(oldDateTime, DateTimePart.Seconds, 0);
Ось метод, є, мабуть, кращий спосіб, але я просто збився з цього:
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
);
}
Я щойно натрапив на цю посаду, тому що у мене була подібна проблема, з якою я хотів встановити час для об'єкта Entity Framework в MVC, який отримує дату з виду (дата-вибору), тому компонент часу становить 00:00:00, але мені потрібно це теперішній час. На основі відповідей у цій публікації я придумав:
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();
Ви можете призначити початкове значення новому DateTime
значенню різними способами:
Спосіб розширення 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);
}
потім використовуючи ChangeTime
:
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.ChangeTime(12, 20, 10);
використовуючи методи Add
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.AddHours(12).AddMinutes(20).AddSeconds(10);
використовуючи Timespan
DateTime datetime = DateTime.Now; //Your DateTime
datetime = datetime.Date.Add(new TimeSpan(12, 20, 10));
використовуючи початкове значення
DateTime datetime = DateTime.Now;
datetime = new DateTime(datetime.Year, datetime.Month, datetime.Day, 12, 20, 10);
Що не так з методом DateTime.AddSeconds, за допомогою якого ви можете додати або відібріти секунди?
DateTime s;
//s = datevalue
s = s.AddMilliseconds(10);
s = s.AddMinutes(10);
s = s.AddSeconds(10);
s = s.AddHours(10);
ви можете додати значення + ve / -ve в параметр.
s.Add(new TimeSpan(1, 1, 1));
Хіба це не вирішує ваші проблеми ??
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;
}
Використовуйте так:
Console.WriteLine (DateTime.Now.ClearTimeFrom (eTimeFragment.hours))
це має повернутись: 2016-06-06 00: 00: 00.000
Найкраще рішення:
currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
ось гетто спосіб, але він працює :)
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)
але не рекомендував би його.