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
最难的部分是 Weekday
和 WeekOfTheYear
,它们在 C# 中并不直接存在。我在 SO 上找到的一些解决方案是错误的,所以它让我走上了错误的道路。请注意,答案会根据一周的第一天而有所不同。
更新: 我刚刚注意到我正在测试去年的 VB 代码,所以值不一样。这是 VB6 代码,其值来自 Now
。
此外,VB6 在我的笔记本电脑上处于 EST 时区,而 dotnetfiddle 始终是 UTC。我只是减去 4 小时,所以时间是一样的。
目前正在将 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
最难的部分是 Weekday
和 WeekOfTheYear
,它们在 C# 中并不直接存在。我在 SO 上找到的一些解决方案是错误的,所以它让我走上了错误的道路。请注意,答案会根据一周的第一天而有所不同。
更新: 我刚刚注意到我正在测试去年的 VB 代码,所以值不一样。这是 VB6 代码,其值来自 Now
。
此外,VB6 在我的笔记本电脑上处于 EST 时区,而 dotnetfiddle 始终是 UTC。我只是减去 4 小时,所以时间是一样的。