Как изменить время в DateTime?

как я могу изменить время только в DateTime переменной?

DateTime s = some datetime;

мне нужно изменить только часть времени в s.

26 ответов


вы не можете изменить значение DateTime - оно неизменяемо. Однако, вы можете изменить переменную новое значение. Самый простой способ сделать это, чтобы изменить только время, - создать TimeSpan с соответствующим временем и использовать DateTime.Дата собственности:

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

s сейчас будет та же дата, но в 10.30.

отметим, что DateTime игнорирует переходы летнего времени, представляющие "наивное" григорианское время в обоих направлениях (см. раздел замечаний в the DateTime docs). Исключение составляют только .Now и .Today: они получают текущее системное время, которое отражает эти события по мере их возникновения.

это то, что побудило меня начать Нода Времени проект, который теперь готов к производству. Его ZonedDateTime тип знать связав его в 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);

важно отметить, что это расширение возвращает новая объект даты, поэтому вы не можете этого сделать:

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

таким образом, вы сохраняете свою дату, вставляя новые часы, минуты и секунды по своему вкусу.


один лайнер

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

The TimeOfDay свойство


случилось на этом посту, поскольку я искал ту же функциональность, что и это, возможно, сделать то, что хотел парень. Возьмите исходную дату и замените часть времени

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 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, как 2014/02/05 18:19: 51 и хотите только 2014/02/05, вы можете сделать это:

_yourDateTime = new DateTime(_yourDateTime.Year, _yourDateTime.Month, _yourDateTime.Day)

добавить .Дата к вашей дате устанавливает его в полночь (00:00).

MyDate.Date

Примечание в equivavalent SQL-это CONVERT(DATETIME, CONVERT(DATE, @MyDate))

что делает этот метод настолько хорошим, что он быстро печатается и легко читается. Бонус заключается в том, что нет конвертации из строк.

т. е. Чтобы установить сегодняшнюю дату на 23: 30, используйте:

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

вы можете, конечно, заменить DateTime.Сейчас или MyDate с любой даты по вашему выбору.


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 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.Метод AddSeconds, где вы можете добавить или вычесть секунды?


при создании 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 в оригинале 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;

        }

используйте так:


С DateTime является неизменяемым, новый экземпляр должен быть создан, когда компонент даты должен быть изменен. К сожалению, нет встроенной функциональности для установки отдельных компонентов a 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));