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

На английском языке:

recursion = n. See recursion.
330
задан Mr Rubix 12 November 2018 в 10:36
поделиться

10 ответов

Вы не можете изменить значение 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 , который сейчас готов к производству.

561
ответ дан 23 November 2019 в 00:46
поделиться

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

0
ответ дан 23 November 2019 в 00:46
поделиться

Разве это не решает ваши проблемы ??

Dateime dt = DateTime.Now;
dt = dt.AddSeconds(10);
0
ответ дан 23 November 2019 в 00:46
поделиться

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

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

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

var newDt = s.Date + TimeSpan.FromHours(2);
22
ответ дан 23 November 2019 в 00:46
поделиться
s = s.Date.AddHours(x).AddMinutes(y).AddSeconds(z);

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

69
ответ дан 23 November 2019 в 00:46
поделиться
  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));
-1
ответ дан 23 November 2019 в 00:46
поделиться

Я бы сказал, что оба случая актуальны. Просто запишите отдельные фрагменты в нужное место в файле с отображением памяти в произвольном порядке по мере их поступления. Это, конечно, полезно только в том случае, если вы знаете, куда должен идти каждый фрагмент, как в загрузчике 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
        );
}
1
ответ дан 23 November 2019 в 00:46
поделиться

здесь метод гетто, но оно работает : )

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));
-5
ответ дан 23 November 2019 в 00:46
поделиться

Выбор случайных значений, а затем отбрасывание тех, которые вы уже использовали, - это плохая идея. Это увеличивает время выполнения, поскольку пул доступных номеров становится меньше, так как вы выбрасываете все больше и больше.

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

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
0
ответ дан 23 November 2019 в 00:46
поделиться

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

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);
94
ответ дан 23 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: