这花了我一段时间,但这就是我要去的。
首先,dFilterDate3 不正确。不是年份,而是基于年份的天数。
var dFilterDate1 = DateTime.Now.AddYears(-2);
var dFilterDate2 = dFilterDate1.AddDays(-4);
var dFilterDate3 = dFilterDate1.AddDays(-(dFilterDate1.DayOfYear - 1));
var dFilterDate4 = dFilterDate3.AddYears(-1);
其次,C# 几个星期都没有内置的等价物,所以我不得不从 SO 中复制一些辅助函数。
我还必须将代码分解为许多临时变量,这就是我得到的:
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
var dFilterDate1 = DateTime.Now.AddHours(-4); // UTC to EST for apples to apples testing
var dFilterDate2 = dFilterDate1.AddDays(-4);
var dFilterDate3 = dFilterDate1.AddDays(-(dFilterDate1.DayOfYear - 1));
var dFilterDate4 = dFilterDate3.AddYears(-1);
var dFilterDate5temp1 = ((int)dFilterDate1.DayOfWeek + 1) - 1; // this is for readability. -1 is needed for C# vs VB
var dFilterDate5temp2 = (int)dFilterDate4.DayOfWeek + 1;
var dFilterDate5temp3 = dFilterDate4.AddDays(-dFilterDate5temp2);
var dFilterDate5temp4 = GetWeekOfYear(dFilterDate1);
var dFilterDate5temp5 = dFilterDate5temp3.AddDays(7 * (dFilterDate5temp4 - 1));
var dFilterDate5 = dFilterDate5temp5.AddDays(dFilterDate5temp1);
Console.WriteLine(dFilterDate1);
Console.WriteLine(dFilterDate2);
Console.WriteLine(dFilterDate3);
Console.WriteLine(dFilterDate4);
Console.WriteLine(dFilterDate5);
}
public static int GetWeekOfYear(DateTime dt)
{
DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar;
return cal.GetWeekOfYear(dt, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
}
}
你可以在这里测试https://dotnetfiddle.net/LFYfyG
我得到这个作为输出:
9/23/2021 11:58:07 AM
9/19/2021 11:58:07 AM
1/1/2021 11:58:07 AM
1/1/2020 11:58:07 AM
9/23/2020 11:58:07 AM
这是来自 VB6:
这是我的 VB6 代码,显示了我是如何分解的
Private Sub Command1_Click()
Dim dFilterDate1 As String
Dim dFilterDate5temp As Integer
dFilterDate1 = DateAdd("yyyy", -1, Now) ' I tried many different values for this - this is one year from now so it is not exactly the same as the C# example
dFilterDate2 = DateAdd("d", -4, dFilterDate1)
dFilterDate3 = DateAdd("y", -(DatePart("y", dFilterDate1) - 1), dFilterDate1)
dFilterDate4 = DateAdd("yyyy", -1, dFilterDate3)
dFilterDate5 = DateAdd("d", Weekday(CDate(dFilterDate1)) - 1, CDate(DateAdd("ww", Format(CDate(dFilterDate1), "ww") - 1, CDate(CDate(dFilterDate4) - Weekday(CDate(dFilterDate4))))))
dFilterDate5temp1 = Weekday(CDate(dFilterDate1), vbSunday) - 1
dFilterDate5temp2 = Weekday(CDate(dFilterDate4), vbSunday)
dFilterDate5temp3 = CDate(dFilterDate4) - dFilterDate5temp2
dFilterDate5temp4 = Format(CDate(dFilterDate1), "ww")
dFilterDate5temp5 = DateAdd("ww", dFilterDate5temp4 - 1, CDate(dFilterDate5temp3))
dFilterDate5New = DateAdd("d", dFilterDate5temp1, CDate(dFilterDate5temp5))
Text1.Text = dFilterDate1
Text2.Text = dFilterDate2
Text3.Text = dFilterDate3
Text4.Text = dFilterDate4
Text5.Text = dFilterDate5
Text6.Text = dFilterDate5New
End Sub
最难的部分是 C# 中不直接存在的 Weekday 和 WeekOfTheYear。我在 SO 上找到的一些解决方案是错误的,因此导致我走错了路。请注意,根据一周的第一天,答案会有所不同。
更新:我刚刚注意到我在测试去年的 VB 代码,所以值不一样。这是带有来自Now 的值的VB6 代码。
此外,VB6 在我的笔记本电脑上运行在 EST 时区,而 dotnetfiddle 始终是 UTC。我只是减去了 4 个小时,所以时间是一样的。