Как получить дату следующего наступающего конкретного дня в C # - PullRequest
0 голосов
/ 26 апреля 2018

Как я могу получить дату следующего наступающего понедельника или следующей наступающей пятницы в C #.Допустим, сегодня среда, и я хочу получить дату наступления пятницы.Это то, что я сделал

DateTime time = DateTime.Now.Date;
DateTime NextFriday;
if (time.DayOfWeek == DayOfWeek.Wednesday)
{
    NextFriday = DateTime.Now.AddDays(2);
}

с этим подходом. Я должен инициировать 7 переменных для каждого дня и 7 условий для каждого дня, чтобы найти следующий конкретный день.

Есть ли какой-нибудь лучший и чистый код, по которому я могу получить дату любого следующего дня.

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

DayOfWeek - это просто перечисление от 0 до 6, поэтому с модульной арифметикой вы можете использовать разницу между вашей интересующей датой и целевым днем ​​недели, чтобы вычислить количество дней, которое вы должны добавить.

Быстрыйпредупреждение, вам нужно учитывать часовой пояс интереса, когда вы спрашиваете, что означает «сегодня».Это означает разные вещи в зависимости от того, с какой стороны строки даты вы живете.

using System;

public class Program
{

    public static DateTime NextDayForDay(DayOfWeek dayOfWeek, DateTime occurringAfter)
    {
        return occurringAfter.AddDays(((dayOfWeek - occurringAfter.DayOfWeek + 6) % 7)+1); 
    }

    public static void Main()
    {
        for (int i=0; i < 7; i++)
        {
            for (int j=0; j < 7; j++)
            {
                DayOfWeek dayOfWeek = (DayOfWeek)(((int)DayOfWeek.Sunday + j) % 7);

                DateTime test = DateTime.Today.AddDays(i);
                Console.WriteLine($"{test}=>Next {dayOfWeek} is {NextDayForDay(dayOfWeek, test)}");
            }
        }   
    }
}
0 голосов
/ 26 апреля 2018

Возможно, вам следует использовать временную библиотеку, которая поддерживает это, например, NodaTime.

См. date.Next(IsoDayOfWeek.Sunday) в https://nodatime.org/1.3.x/userguide/arithmetic

Вот альтернативное решение (пожалуйста, не используйте это):

DateTime F(DateTime t, DayOfWeek dayOfWeek) => t.AddDays((7 + (int)dayOfWeek - (int)t.DayOfWeek) % 7);

for (int i = 0; i < 7; i++)
    Console.WriteLine((DayOfWeek)i + " " + F(DateTime.Now, (DayOfWeek)i));

Выходы (в среду 25.04.2008 г.):

Sunday 4/29/2018 12:00:00 AM
Monday 4/30/2018 12:00:00 AM
Tuesday 5/1/2018 12:00:00 AM
Wednesday 4/25/2018 12:00:00 AM
Thursday 4/26/2018 12:00:00 AM
Friday 4/27/2018 12:00:00 AM
Saturday 4/28/2018 12:00:00 AM
0 голосов
/ 26 апреля 2018

Используя следующее

public int CalculateOffset(DayOfWeek current, DayOfWeek desired) {
    // f( c, d ) = [7 - (c - d)] mod 7
    // f( c, d ) = [7 - c + d] mod 7
    // c is current day of week and 0 <= c < 7
    // d is desired day of the week and 0 <= d < 7
    int c = (int)current;
    int d = (int)desired;
    int offset = (7 - c + d) % 7;
    return offset == 0 ? 7 : offset;
}

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

DateTime now = DateTime.Now.Date;
int offset = CalculateOffset(now.DayOfWeek, DayOfWeek.Friday);
DateTime nextFriday = now.AddDays(offset);
0 голосов
/ 26 апреля 2018
DateTime today = DateTime.Today;
DateTime nextFriday = System.Linq.Enumerable.Range(0, 6)
  .Select(i => today.AddDays(i))
  .Single(day => day.DayOfWeek == DayOfWeek.Friday);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...