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

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

315 голосов
/ 07 декабря 2009

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

DateTime s = some datetime;

Ответы [ 27 ]

534 голосов
/ 07 декабря 2009

Вы не можете изменить значение 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 записью базы данных .

89 голосов
/ 07 декабря 2009

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

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);
61 голосов
/ 07 декабря 2009
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);

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

28 голосов
/ 23 августа 2012

один вкладыш

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

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

20 голосов
/ 07 декабря 2009

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

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

Примерно так:

var newDt = s.Date + TimeSpan.FromHours(2);
15 голосов
/ 07 ноября 2012

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

11 голосов
/ 27 июля 2017

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

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");
8 голосов
/ 04 сентября 2015
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

8 голосов
/ 26 мая 2011

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

DateTime dayOpen = DateTime.Parse(processDay.ToShortDateString() + " 05:00 AM");
3 голосов
/ 30 октября 2018

На самом деле вы не можете изменить время, как только оно будет создано. Но вы можете легко создать его с помощью многих конструкторов: 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...