Как изменить время только в переменной DateTime?
DateTime s = some datetime;
Мне нужно изменить только часть времени в s.
Как изменить время только в переменной DateTime?
DateTime s = some datetime;
Мне нужно изменить только часть времени в s.
Вы не можете изменить значение DateTime - оно неизменно. Однако вы можете изменить переменную, чтобы иметь новое значение. Самый простой способ сделать это, чтобы изменить время - это создать TimeSpan с соответствующим временем и использовать свойство DateTime.Date:
DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
s теперь будет той же даты, но в 10:30 утра.
Обратите внимание, что DateTime игнорирует переход на летнее время, представляя "наивное" григорианское время в обоих направлениях (см. раздел "Примечания" в DateTime docs). Единственными исключениями являются .Now и .Today: они извлекают текущее системное время, которое отражает эти события по мере их возникновения.
Это то, что побудило меня начать проект , связав его с записью базы данных tz.
Хорошо, я погружаюсь в свое предложение, метод расширения:
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);
Важно отметить, что это расширение возвращает объект даты new, поэтому вы не можете этого сделать:
DateTime myDate = DateTime.Now;
myDate.ChangeTime(10,10,10,0);
Но вы можете сделать это:
DateTime myDate = DateTime.Now;
myDate = myDate.ChangeTime(10,10,10,0);
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
Таким образом, вы сохраняете свою дату, вставляя вам новые часы, минуты и секунды.
DateTime - неизменяемый тип, поэтому вы не можете его изменить.
Однако вы можете создать новый экземпляр DateTime на основе вашего предыдущего экземпляра. В вашем случае кажется, что вам нужно свойство Date, и вы можете добавить TimeSpan, который представляет время суток.
Что-то вроде этого:
var newDt = s.Date + TimeSpan.FromHours(2);
один вкладыш
var date = DateTime.Now.Date.Add(new TimeSpan(4, 30, 0));
вернет сегодняшнюю дату с 4:30:00, заменит DateTime.Now с любым объектом даты
Если у вас уже есть время, сохраненное в другом объекте 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 dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");
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") ) ;
Выполненная: Сегодня = 9/04/15 00:00:00
Если у вас есть DateTime как 2014/02/05 18:19:51 и хотите только 2014/02/05, вы можете сделать это:
_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)
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);
Добавление. Дата на дату устанавливает его в полночь (00:00).
MyDate.Date
Примечание. Equivavalent SQL - это CONVERT(DATETIME, CONVERT(DATE, @MyDate))
Что делает этот метод настолько хорошим, так это то, что он быстро набирается и легко читается. Бонус в том, что нет никакого преобразования из строк.
т.е. Чтобы установить сегодня дату до 23:30, используйте:
DateTime.Now.Date.AddHours(23).AddMinutes(30)
Вы можете, конечно, заменить DateTime.Now или MyDate на любую дату по вашему выбору.
Используйте Date.Add и добавьте New TimeSpan с новым временем, которое вы хотите добавить
DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))
Вот метод, который вы могли бы использовать для этого, используйте его так:
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, который получает дату из представления (datepicker), поэтому компонент времени равен 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 s = new DateTime(datetime.Year, datetime.Month, datetime.Day, 8, 36, 44);
И если вам нужен конкретный формат даты и времени:
DateTime s = new DateTime(datetime.Year, datetime.Month, datetime.Day, 8, 36, 44).ToString("yyyy-MM-dd h:mm:ss")
Что случилось с методом DateTime.AddSeconds, где вы можете добавить или вычесть секунды?
Когда вы создаете свой объект DateTime, используйте конструктор, который позволяет указать время:
var myDateTime = new DateTime(2000, 01, 01, 13, 37, 42); // 2000-01-01 13:37:42
Если у вас уже есть объект DateTime и вы хотите изменить время, вы можете добавить минуты, часы или секунды к своему 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 к исходному 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
Не исправляет ли ваши проблемы?
Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);
Я предпочитаю это:
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;
}
Используйте это:
Console.WriteLine(DateTime.Now.ClearTimeFrom(eTimeFragment.hours))
это должно возвратиться: 2016-06-06 00: 00: 00.000
Так как 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);
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));
Лучшее решение:
currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);
Попробуйте этот
var NewDate = Convert.ToDateTime(DateTime.Now.ToString("dd/MMM/yyyy")+" "+"10:15 PM")/*Add your time here*/;
вот гетто, но он работает:)
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));