DateAdd 和 DatePart 从 VB6 到 C#

DateAdd and DatePart from VB6 to C#

目前正在将 VB6 转换为 C#,但遇到了有关 DateAdd 和 DatePart 的问题。希望如果有人擅长 VB6 可以启发我。谢谢

以下是 VB6 代码:

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))))))

下面是我的 C# 代码。

dFilterDate2 = dFilterDate1.AddDays(-4);
dFilterDate3 = dFilterDate1.AddYears(-dFilterDate1.DayOfYear-1);
dFilterDate4 = dFilterDate3.AddYears(-1);
dFilterDate5 = ?;

这花了我一段时间,但这就是我要做的。

首先,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

最难的部分是 WeekdayWeekOfTheYear,它们在 C# 中并不直接存在。我在 SO 上找到的一些解决方案是错误的,所以它让我走上了错误的道路。请注意,答案会根据一周的第一天而有所不同。

更新: 我刚刚注意到我正在测试去年的 VB 代码,所以值不一样。这是 VB6 代码,其值来自 Now

此外,VB6 在我的笔记本电脑上处于 EST 时区,而 dotnetfiddle 始终是 UTC。我只是减去 4 小时,所以时间是一样的。