На английском языке:
recursion = n. See recursion.
Вы не можете изменить значение DateTime - оно неизменяемо. Однако вы можете изменить переменную, чтобы она имела новое значение. Самый простой способ изменить время - создать TimeSpan с соответствующим временем и использовать свойство DateTime.Date:
DateTime s = ...;
TimeSpan ts = new TimeSpan(10, 30, 0);
s = s.Date + ts;
s
теперь будет той же датой, но в 10:30.
Обратите внимание, что DateTime
игнорирует переходы на летнее время, представляя «наивное» григорианское время в обоих направлениях (см. Раздел «Примечания» в DateTime
docs ). Единственными исключениями являются .Теперь
и . Сегодня
: они извлекают текущее системное время, которое отражает эти события по мере их возникновения.
Это то, что побудило меня запустить Проект Noda Time , который сейчас готов к производству.
Что не так с методом DateTime.AddSeconds, в котором можно добавлять или вычитать секунды?
Разве это не решает ваши проблемы ??
Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);
DateTime - это неизменяемый тип, поэтому вы не можете изменить его.
Однако вы можете создать новый экземпляр DateTime на основе вашего предыдущего экземпляра. В вашем случае похоже, что вам нужно свойство Date, и затем вы можете добавить TimeSpan, который представляет время дня.
Примерно так:
var newDt = s.Date + TimeSpan.FromHours(2);
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);
Таким образом вы сохраняете дату, добавляя при этом новые часы, минуты и секунды по своему вкусу.
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));
Я бы сказал, что оба случая актуальны. Просто запишите отдельные фрагменты в нужное место в файле с отображением памяти в произвольном порядке по мере их поступления. Это, конечно, полезно только в том случае, если вы знаете, куда должен идти каждый фрагмент, как в загрузчике bittorrent. Если вам нужно выполнить дополнительный анализ, чтобы узнать, куда должен идти фрагмент, преимущество файла с отображением памяти может быть не таким большим.
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
);
}
здесь метод гетто, но оно работает : )
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));
Выбор случайных значений, а затем отбрасывание тех, которые вы уже использовали, - это плохая идея. Это увеличивает время выполнения, поскольку пул доступных номеров становится меньше, так как вы выбрасываете все больше и больше.
Что вам нужно, так это список в случайном порядке, который я бы реализовал с помощью следующего кода (псевдокод, поскольку это домашнее задание ):
dim n[10] // gives n[0] through n[9]
for each i in 0..9:
n[i] = i // initialize them to their indexes
nsize = 10 // starting pool size
do 10 times:
i = rnd(nsize) // give a number between 0 and nsize-1
print n[i]
nsize = nsize - 1 // these two lines effectively remove the used number
n[i] = n[nsize]
Просто выбрав случайное число из пула, а затем заменив его верхним числом из этого пула и уменьшив размер пула, вы получите перемешивание, не беспокоясь о большом количестве свопов заранее. часов или секунд до вашего 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
Хорошо, я погружаюсь в свое предложение, метод расширения:
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);