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

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

DateTime s = some datetime;

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

Ответ 1

Вы не можете изменить значение 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.

Ответ 2

Хорошо, я погружаюсь в свое предложение, метод расширения:

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

Ответ 3

s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);

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

Ответ 4

DateTime - неизменяемый тип, поэтому вы не можете его изменить.

Однако вы можете создать новый экземпляр DateTime на основе вашего предыдущего экземпляра. В вашем случае кажется, что вам нужно свойство Date, и вы можете добавить TimeSpan, который представляет время суток.

Что-то вроде этого:

var newDt = s.Date + TimeSpan.FromHours(2);

Ответ 5

один вкладыш

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

вернет сегодняшнюю дату с 4:30:00, заменит DateTime.Now с любым объектом даты

Ответ 6

Если у вас уже есть время, сохраненное в другом объекте 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, мы получаем только дату и добавляем временной интервал.

Ответ 7

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

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

Ответ 8

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

Ответ 9

Если у вас есть DateTime как 2014/02/05 18:19:51 и хотите только 2014/02/05, вы можете сделать это:

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

Ответ 10

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

Ответ 11

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

MyDate.Date

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

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

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

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

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

Ответ 12

Используйте Date.Add и добавьте New TimeSpan с новым временем, которое вы хотите добавить

DateTime dt = DateTime.Now
dt.Date.Add(new TimeSpan(12,15,00))

Ответ 13

Вот метод, который вы могли бы использовать для этого, используйте его так:

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

Ответ 14

Я только что столкнулся с этим сообщением, потому что у меня была аналогичная проблема, когда я хотел установить время для объекта Entity Framework в MVC, который получает дату из представления (datepicker), поэтому компонент времени равен 00:00:00 но мне нужно, чтобы это было текущее время. Основываясь на ответах в этом посте, я придумал:

myEntity.FromDate += DateTime.Now.TimeOfDay;

Ответ 15

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

Ответ 16

Самое простое решение:

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

Ответ 17

Что случилось с методом DateTime.AddSeconds, где вы можете добавить или вычесть секунды?

Ответ 18

Когда вы создаете свой объект 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

Ответ 19

Не исправляет ли ваши проблемы?

Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);

Ответ 20

Я предпочитаю это:

DateTime s = //get some datetime;
s = new DateTime(s.Year, s.Month,s.Day,s.Hour,s.Minute,0);

Ответ 21

 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

Ответ 22

Так как 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);

Ответ 23

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

Ответ 24

Лучшее решение:

currdate.AddMilliseconds(currdate.Millisecond * -1).AddSeconds(currdate.Second * -1).AddMinutes(currdate.Minute * -1).AddHours(currdate.Hour * -1);

Ответ 25

Попробуйте этот

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

Ответ 26

вот гетто, но он работает:)

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