- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可能是一个新手问题,但这里是。
我有一种方法,其中类型 DayOfWeek 列表会附加一周中的不同日期(可能是星期三和星期六、星期日、星期一和星期五等)。
给定该列表,我需要将其与日期时间参数进行比较,在 DayOfWeek 列表中找到与 DateTime 参数最接近的工作日,并根据列表中的工作日向 DateTime 参数添加天数。
例如,如果传入的 DateTime 参数是星期日,而我的 DayOfWeek 列表包含星期三和星期六,则需要将该参数移回星期六,因为它在列表中最接近。
同样,如果我的列表包含星期日、星期一和星期六,而传入的参数是星期四,则必须将参数移至星期六。
最后,如果参数与列表中的两个工作日等距(传入星期三,星期一和星期五在列表中...或者传入星期日,列表中星期二和星期五),则参数需要向前移动到下一个最近的工作日(在第一种情况下为星期五,在第二种情况下为星期二)。
将下一个最近的工作日的距离从传入的日期转换为整数是理想的(至少对我来说),这样我可以做类似的事情:
passedInDate = passedInDate.AddDays(dayOfWeekDistance);
return passedInDate;
但我愿意接受建议。
我尝试过 LINQ 语句,例如:
int dayOfWeekDistance = targetDayOfWeekList.Min(x => (x - passedInDate));
但是没有效果。我一定缺少一些奇特的 LINQ 语句。
请注意,如果传入的日期是星期日并且列表中最接近的工作日是星期六,则我无法开始工作的主要项目是日期从星期日回溯到星期六(同样,如果传入的日期是星期一,最近的工作日是星期五,该日期需要一直回溯到星期五)。
如果我错过了什么或者我只是没有讲明白,请告诉我。
欢迎所有帮助!谢谢。
最佳答案
让我们将问题分成几个小部分。
注意:以下所有方法都应该放在这样的类中
public static class DayOfWeekExtensions
{
}
首先,您希望Sunday
成为一周的最后一天,而在DayOfWeek
enum
中它首先被定义。因此,让我们创建一个函数来解释这一点:
public static int GetIndex(this DayOfWeek source)
{
return source == DayOfWeek.Sunday ? 6 : (int)source - 1;
}
然后我们需要一个函数来计算两个 DayOfWeek
值之间的距离(偏移量):
public static int OffsetTo(this DayOfWeek source, DayOfWeek target)
{
return source.GetIndex() - target.GetIndex();
}
我们还添加一个函数,给定一个主元和两个 DayOfWeek
值,选择两个值中最接近的值(应用前向优先级规则):
public static DayOfWeek Closest(this DayOfWeek pivot, DayOfWeek first, DayOfWeek second)
{
int comp = Math.Abs(first.OffsetTo(pivot)).CompareTo(Math.Abs(second.OffsetTo(pivot)));
return comp < 0 || (comp == 0 && first.GetIndex() > pivot.GetIndex()) ? first : second;
}
现在我们准备实现从序列中查找最接近日期的方法。它可以通过多种方式实现,这里是使用(最后!:) LINQ Aggregate
的实现。方法:
public static DayOfWeek? Closest(this IEnumerable<DayOfWeek> source, DayOfWeek target)
{
if (!source.Any()) return null;
return source.Aggregate((first, second) => target.Closest(first, second));
}
最后,添加一个计算最近距离的函数:
public static int ClosestDistance(this IEnumerable<DayOfWeek> source, DayOfWeek target)
{
return source.Closest(target)?.OffsetTo(target) ?? 0;
}
我们就完成了。我们刚刚创建了一个小的简单的可重用实用程序类。
您的情况的用法是:
int dayOfWeekDistance = targetDayOfWeekList.ClosestDistance(passedInDate.DayOfWeek);
更新:事实证明您的要求不同。
应用相同的原理,首先我们需要一个函数来计算一周中两天之间的向前和向后距离的最小值,应用向前优先规则。
public static int MinDistanceTo(this DayOfWeek from, DayOfWeek to)
{
int dist = to - from;
return dist >= 4 ? dist - 7 : dist <= -4 ? dist + 7 : dist;
}
它的作用基本上是将可能的 -6..6
包含范围内的值转换为 -3..3
包含范围内的值。
然后我们只需要一个函数,它将通过使用 Select
+ Aggregate
来实现所讨论的方法(也可以使用 Min 来实现)
和自定义比较器)。它基本上比较两个绝对距离并再次应用前向优先级规则:
public static int MinDistanceTo(this DayOfWeek from, IEnumerable<DayOfWeek> to)
{
if (!to.Any()) return 0;
return to.Select(x => from.MinDistanceTo(x)).Aggregate((dist1, dist2) =>
{
if (dist1 == dist2) return dist1;
int comp = Math.Abs(dist1).CompareTo(Math.Abs(dist2));
return comp < 0 || (comp == 0 && dist1 > 0) ? dist1 : dist2;
});
}
用法是:
int dayOfWeekDistance = passedInDate.DayOfWeek.MinDistanceTo(targetDayOfWeekList);
关于c# - 在 DayOfWeek 列表中查找最近的工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46182046/
我正在尝试创建一个脚本,该脚本在设定的时间段(上个月的 23 日和本月的 23 日)内获取工作日、日历日和工作日的计数。 我有以下脚本,我尝试使用 Worksheet Functions 但它不起作用
如何将 xts 对象子集以仅包含工作日(周一至周五,周六和周日除外)? 最佳答案 这是我要做的: library(xts) data(sample_matrix) sample.xts <- as.x
我一直在尝试计算在特定工作日内创建了多少个值没有成功: SELECT count(*) as count FROM packets WHERE strftime("%w", timeIn) = '1'
我正在编写一个脚本,它只在周一至周五上午 8 点至下午 5 点期间运行。问题是在它脱离 8-5 或 M-F while() 循环之后,它只是......不知道如何回到循环中。这让我觉得我可能以错误的角
我想得到上一季度的最后一个工作日(工作日),比如 2019.03.31 是星期天,所以我的要求是得到 2019.03.29 的输出。 我写了下面的代码,它工作得很好但看起来不整洁,在我看来 kdb 有
我想知道我在这个网格中选择日期时的工作日。我尝试了有效的 JavaScript 代码,但在 C# 中使用它时遇到了一些困难。 string startdate, enddate;
如标题所示,我正在为我的应用程序寻找解决方案,包括在工作日添加开放和关闭时间。 图像我的应用程序: View list days of the week View after selecting th
SELECT * FROM (`users`) JOIN `artistprofiles` AS art ON `art`.`user_id` = `users`.`id` WHE
我需要将这个函数翻译成swift。基本上它得到了本周的“n”日是什么。因此,例如,如果我将它与 NSDate().getWeekDay(0) 一起使用,它会给我 9 月 11 日星期日,依此类推。但似
我是工作日 SOAP API 的新手,我正在尝试弄清楚如何发送 SOAP 请求以使用 SOAPUI 进行身份验证。 任何建议将不胜感激。 最佳答案 Workday API 使用 WS-Security
我面临以下问题:我必须将当前日期与给定工作日和时间的特定时间点进行比较,如下所示: const myObj = { "weekday": "Tuesday", "timeOfDay": "10
我之前已经发布过相关内容,这有助于我获得以下 SQL: SELECT fname, MONTH( eventDate ) , IF( WEEKDAY( eventDate ) = 5,1,0)) A
尝试使用 moment.js 获得第二个星期四(例如)。本周四不。下一个。 2 个星期四内的日期。 我已经尝试过 moment().add(1, 'week').day(4) 仅获取下周的星期四(仅当
现在是 2017 年 10 月 8 日,星期日。 var weekday = Calendar(identifier: .iso8601).component(.weekday, from: Date
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我们使用以下规则来标记延迟 2 天或更长时间的工作项: Changed Date , > , = , [Field], >[Field], =[Field], <=[Field], In, No
我有平日 jQuery UI 选项卡,如下所示,我想在当前工作日打开它们: Monday Tuesday Wednesday Thursday Friday
我想找到一周中某一天到一周中另一天的相对距离。假设以下 R 输入是从第 0 天开始的相对差异(以天为单位): day pmin( day %% 7, rev(day)%%7) [1] 0 1 2
我一直在寻找下个月第一,第二,第三或第四工作日(工作日)的日期。 我有以下代码: NSTimeInterval *lastDue; // unix time stamp from last due d
有一个 pandas 数据框 df,为了从日期列中获取工作日,我做了: df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.strftime('%w')
我是一名优秀的程序员,十分优秀!