C# 如何计算下一年某一特定起始日期的最后一个星期六的日期
我想从给定的起始日期开始计算上周六的日期。 例如: 起始日期=#2013年9月28日# 然后我想从那一天开始,每年的最后一个星期六是: 2014年的星期六是:2014年9月27日 它将每年更新一次,下一次更新是: 2015年的星期六是:2015年9月26日 其次是: 2016年的星期六是:2016年9月24日 它像通常的日期一样运行,但开始日期不是1/1/[年],而是[星期六的日期]/9/年。。。 我将接受vb或c中的逻辑。。。 以下是我在vb.net中的代码: Dim DstartDate作为日期 数据开始日期=#2013年9月28日#C# 如何计算下一年某一特定起始日期的最后一个星期六的日期,c#,asp.net,vb.net,C#,Asp.net,Vb.net,我想从给定的起始日期开始计算上周六的日期。 例如: 起始日期=#2013年9月28日# 然后我想从那一天开始,每年的最后一个星期六是: 2014年的星期六是:2014年9月27日 它将每年更新一次,下一次更新是: 2015年的星期六是:2015年9月26日 其次是: 2016年的星期六是:2016年9月24日 它像通常的日期一样运行,但开始日期不是1/1/[年],而是[星期六的日期]/9/年。。。 我将接受vb或c中的逻辑。。。 以下是我在vb.net中的代码: Dim DstartDate作为
tnextyear=DstartDate.AddYears(1)
tyear=tnextyear.Year
tmonth=tnextyear.Month
tdate=tnextyear.Day
tday=tnextyear.DayOfWeek.ToString()
将日期变为日期
如果是(星期六)那么
ttdate=tnextyear.AddDays(-1)
tday=ttdate.DayOfWeek.ToString()
如果是星期六,那么
ttdate=tnextyear.AddDays(-2)
tday=ttdate.DayOfWeek.ToString()
如果结束
如果结束
tday=ttdate.DayOfWeek.ToString()
tyear+=1
lbltestYear.Text=tday&tyear
它不执行if条件。。。。标签显示“如果”之前的日期。。。在这段代码中,如果不是“星期六”,我会把日期减一,因为每年的日期都会减少一个到星期六,每4年减少2个。。。我还没有每4年设置一次条件,因为我只是想看看代码的输出是如何
先谢谢你。。。很抱歉之前,,,,假设你需要知道未来10年的日期
Dim Startdate As DateTime = #9/28/2013#
For i As Integer = 1 To 10
Dim d As DateTime = Startdate.AddYears(i)
Console.WriteLine(d.AddDays(-(d.DayOfWeek - DayOfWeek.Sunday) - 1))
Next
此代码适用于en US文化(从周日开始的一周)
附言
上述代码返回每年同一天的上周六。如果你需要得到一个月的最后一个星期六,那么使用
Dim Startdate As DateTime=#9/28/2013#
对于i,作为整数=1到10
Dim d As DateTime=新的日期时间(开始日期.年份+i,开始日期.月份+1,1).AddDays(-1)
星期六,星期五,星期六
d=d.AddDays(-1)
环
控制台写入线(d)
下一个
这里有一个C#解决方案
public static void FindLastSaturday(int month, int startYear, int numberOfYears)
{
var dates = Enumerable.Range(startYear, numberOfYears)
.Select(q => FilterFunc(new DateTime(q, month, CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(q, month))));
foreach (DateTime lastSaturday in dates)
{
Console.WriteLine(lastSaturday.ToString("R"));
}
}
private static DateTime FilterFunc(DateTime arg)
{
if (arg.DayOfWeek == DayOfWeek.Saturday)
{
return arg;
}
return FilterFunc(arg.AddDays(-1));
}
它使用LINQ来预测一系列日期,并强制将它们设置为最后一个星期六。示例的输出如下所示
Sat, 27 Sep 2014 00:00:00 GMT
Sat, 26 Sep 2015 00:00:00 GMT
Sat, 24 Sep 2016 00:00:00 GMT
Sat, 30 Sep 2017 00:00:00 GMT
Sat, 29 Sep 2018 00:00:00 GMT
请注意,LINQ给出了2017年的正确答案,该月的最后一天是星期六。“我将接受vb或c#中的解决方案”-我们也会接受。让我们看看你在这两方面的努力。哦。。。对不起,我忘记添加代码了。。。。我会编辑它…大多数日期库都会帮你处理。@shree.pat18对不起,我真的忘了把代码。。。我已经编辑过了。。。谢谢你提醒我…@rots很抱歉,,,我已经编辑过了…你检查过当I=4时会发生什么吗?“上周六不可能在9月23日到来。”加里·瓦索德说得对。我认为这个问题与给定的开始日期和月份有关。更新。你的新代码看起来好多了,你对它的来源有归属感吗?@smirnov谢谢你的帮助。。。我已经得到了解决方案。不幸的是,我在上面的帖子中使用的逻辑是错误的,这就是为什么我要改变它。我刚刚用+52表示下一年的星期六。非常感谢。亲爱的加里,谢谢你帮助我。问题已经解决。@user3567963,没问题,因为代码基本上是由斯米尔诺夫用来更正他的答案的,所以我将把这个添加到社区Wiki中。
public static void FindLastSaturday(int month, int startYear, int numberOfYears)
{
var dates = Enumerable.Range(startYear, numberOfYears)
.Select(q => FilterFunc(new DateTime(q, month, CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(q, month))));
foreach (DateTime lastSaturday in dates)
{
Console.WriteLine(lastSaturday.ToString("R"));
}
}
private static DateTime FilterFunc(DateTime arg)
{
if (arg.DayOfWeek == DayOfWeek.Saturday)
{
return arg;
}
return FilterFunc(arg.AddDays(-1));
}
Sat, 27 Sep 2014 00:00:00 GMT
Sat, 26 Sep 2015 00:00:00 GMT
Sat, 24 Sep 2016 00:00:00 GMT
Sat, 30 Sep 2017 00:00:00 GMT
Sat, 29 Sep 2018 00:00:00 GMT