Я пытаюсь создать дату начала и окончания с прошлой недели.

Поэтому, если сегодня 02.04.2022, мне нужны случайные дата и время с прошлой недели, чтобы это могло быть

Старт 02.02.2022 10:00

Конец 02.02.2022 10:30

Обратите внимание, что время окончания всегда составляет 30 минут.

Я могу заставить часть даты работать, используя это

Random gen = new Random();
var start = DateTime.Now.AddDays(-7);
int range = (DateTime.Today - DateTime.Today.AddDays(-7)).Days;

var result = start.AddDays(gen.Next(range));
0
signed digital 4 Фев 2022 в 17:28
1
Мне конкретно непонятно, о чем вы спрашиваете. Что именно не работает?
 – 
David
4 Фев 2022 в 17:31
1
Вместо AddDays() и Days используйте AddHours() и Hours и измените -7 на -7 * 24. (Все будет хорошо, если не наступит переход на летнее время.)
 – 
heijp06
4 Фев 2022 в 17:31
1
Я бы сгенерировал случайное число в диапазоне тиков, например. new DateTime(new Random().Next(startDate.Ticks, endDate.Ticks));
 – 
Rand Random
4 Фев 2022 в 17:32
Например. dotnetfiddle.net/CUE4cU
 – 
Rand Random
4 Фев 2022 в 17:35
Предположение: вам нужен результат с 30-минутными интервалами, верно? То есть... где-то на прошлой неделе в момент, когда минуты равны 00 или 30?
 – 
Kjartan
4 Фев 2022 в 18:04

5 ответов

Это должно работать:

Random gen = new Random();
var start = DateTime.Now.AddDays(-7);
start = start.AddDays(gen.Next(6)); // Add 0-6 days
start = start.AddHours(gen.Next(23)); // Add 0-23 hours
start = start.AddMinutes(gen.Next(1)); //Add 0-1 minutes.

var result = new DateTime(
    start.Year,
    start.Month,
    start.Day,
    start.Hour,
    start.Minute % 2 == 0 ? 0 : 30, // If even then zero, if odd then 30.
    0); // 0 seconds
1
Julian Silden Langlo 4 Фев 2022 в 17:37

Это своего рода забавный вызов. Лично мне нравятся простые решения:

var halfHoursPrWeek = 7 * 24 * 2;

// Get last full hour; ex: 04.02.2022 15:00:00
var previousHour = DateTime.Today.AddHours(DateTime.Now.Hour);
var randomNrOfHalfHours = (new Random()).Next(halfHoursPrWeek);

// ex: 31.01.2022 20:30:00
var sometimeLastWeek = previousHour.AddMinutes(-randomNrOfHalfHours * 30);
1
Kjartan 4 Фев 2022 в 18:41

Как я уже сказал в комментарии, создайте объект DateTime на основе тиков.

//startDate 7 days ago, without time so 00:00:00
var startDate = DateTime.Now.Date.AddDays(-7);

//endDate with the time of 23:59:59
//notice manipulating the time this way could lead to a DateTime in the future, if you don't want that only use `DateTime.Now`
var endDate = DateTime.Now.Date.AddDays(1).AddMilliseconds(-1);

//ticks in range of the dateTimes
var ticks = new Random().NextInt64(startDate.Ticks, endDate.Ticks);

//new DateTime
var newDate = new DateTime(ticks);

Console.WriteLine($"NewDate in the range of {startDate} and {endDate}:");
Console.WriteLine(newDate);

https://dotnetfiddle.net/HcyAUD

0
Rand Random 4 Фев 2022 в 17:39

См. Следующее:

            const int MINUTES_PER_WEEK = 7 * 24 * 60;

            DateTime date = DateTime.Now;

            DateTime SundayMidnight = date.AddDays(-(int)date.DayOfWeek).Date;
            DateTime startDate = SundayMidnight.AddDays(-7);

            Random rand = new Random();

            int randomMinutes = rand.Next(MINUTES_PER_WEEK - 30);
            DateTime randomStartDate = startDate.AddMinutes(randomMinutes);
            DateTime randomEndDate = startDate.AddMinutes(randomMinutes + 30); 
0
jdweng 4 Фев 2022 в 17:41

Расчет через тики.

// One week interval in ticks.
const long WEEK = 6048000000000; 

// Initial date & time.
DateTime now = DateTime.Now;

// Random decrease interval of 1 week.
Random gen = new Random();
long reduce = Convert.ToInt64(gen.NextDouble() * WEEK); 
TimeSpan span = TimeSpan.FromTicks(reduce);

// Determine a random date at last week.
DateTime lastWeek = now - span;
0
ng256 4 Фев 2022 в 18:56