【问题标题】:DateAdd and DatePart from VB6 to C#DateAdd 和 DatePart 从 VB6 到 C#
【发布时间】:2021-09-22 18:21:58
【问题描述】:

目前正在将 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 = ?;

【问题讨论】:

  • 这能回答你的问题吗? Equivalent of WeekDay Function of VB6 in C#
  • 什么是dFilterDate1 以及在VB6 中dFilterDate5 的答案是什么?
  • @GSerg 感谢您提供链接,但是与 DateAdd 和 Weekday 结合后看起来很奇怪。
  • @eglease 这不是我可以参考的文件,因为该系统已经使用了至少 10 年(VB6)并且很快就会退役。
  • dFilterDate3 的转换不正确。原始代码将(简单地?)生成 1 月 1 日的日期和 dFilterDate3 的年份。例如,2021 年 9 月 23 日的日期将计算为 2021 年 1 月 1 日。转换后的代码行将从年份中减去一年中一天中的天数,再减去一个; 2021 年 9 月 23 日(第 266 天)的日期将产生 1754 年 9 月 23 日。

标签: c# datetime vb6 datetime-format vb6-migration


【解决方案1】:

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

首先,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# 中不直接存在的 WeekdayWeekOfTheYear。我在 SO 上找到的一些解决方案是错误的,因此导致我走错了路。请注意,根据一周的第一天,答案会有所不同。

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

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

【讨论】:

  • 你可以将所有的 C# 代码放在一行,但我不建议这样做,因为它很难调试。
  • 您的+1) -1 是不必要的,它也是直接的框架代码,不会因语言而异。
  • 没有必要。我把它放在那里是为了表明我是故意这样做的。我相信 vb6 和 .net 之间的常量是不同的。
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多