如何在给定日期的一周内获得工作日?

How to get the week day within a week of given date?

这个问题可能不是最清楚的,但这是我需要的:

var date = new LocalDate(2020, 05, 05);

我需要给定日期所在一周的星期一和星期五的日期。

这是我想出的:

void Main()
{
    var date = new LocalDate(2020, 05, 05);
    var yearWeek = WeekYearRules.Iso.GetWeekOfWeekYear(date);
    var monday = WeekYearRules.Iso.GetLocalDate(date.Year, yearWeek, IsoDayOfWeek.Monday);
    var friday = WeekYearRules.Iso.GetLocalDate(date.Year, yearWeek, IsoDayOfWeek.Friday);
    Console.WriteLine(monday);
    Console.WriteLine(friday);
}

或者您可以将此逻辑提取到扩展方法中,这样您就可以获得:

void Main()
{   
    var date = new LocalDate(2020, 05, 05);
    var monday = date.GetDateOfWeekDay(IsoDayOfWeek.Monday);
    var friday = date.GetDateOfWeekDay(IsoDayOfWeek.Friday);
    Console.WriteLine(monday);
    Console.WriteLine(friday);
}

public static class LocalDateTimeExtensions {
    // I coudn't come up with better name for this function, if you have any suggestions... :)
    public static LocalDate GetDateOfWeekDay(this LocalDate date, IsoDayOfWeek dayOfWeek)
    {
        var currentWeekYear = WeekYearRules.Iso.GetWeekOfWeekYear(date);
        return WeekYearRules.Iso.GetLocalDate(date.Year, currentWeekYear, dayOfWeek);
    }
}

我建议将代码编写为 日期调整器:

public static class DayOfWeekAdjusters
{
    public static Func<LocalDate, LocalDate> ForIsoDayOfWeek(IsoDayOfWeek dayOfWeek) =>
        date => WeekYearRules.Iso.GetLocalDate(
            WeekYearRules.Iso.GetWeekYear(date),
            WeekYearRules.Iso.GetWeekOfWeekYear(date), 
            dayOfWeek);
}

那么你可以使用:

private static readonly Func<LocalDate, LocalDate> MondayAdjuster =
    DayOfWeekAdjusters.ForIsoDayOfWeek(IsoDayOfWeek.Monday);
private static readonly Func<LocalDate, LocalDate> FridayAdjuster =
    DayOfWeekAdjusters.ForIsoDayOfWeek(IsoDayOfWeek.Friday);

...
var date = new LocalDate(2020, 05, 05);
var monday = date.With(MondayAdjuster);
var friday = date.With(FridayAdjuster);

您也可以将这些调节器与 LocalDateTimeOffsetDateTime 一起使用。