将VB6中的DateAdd和Format代码转换为C#

7

我有以下VB代码 -

tAvailableDate = DateAdd("d", 21, Format(Now, gDATEFORMAT))

我正在尝试将这个转换成C#。

到目前为止,我已经转换了如下代码 -

tAvailableDate = DateAdd("d", 21, Format (DateTime.Now, Global.gDATEFORMAT));

但是我找不到DateAdd()Format()功能的替代品。

有什么想法吗?谢谢。


6
你想要实现什么目标?如果你能告诉我们,那么你只需要懂.NET的人,而不是懂.NET和VB6的人。 - Jon Skeet
3个回答

12

DateAdd是一个老旧的VB6方法,由于向后兼容性而被移植到VB.NET中。如果您在C#项目中包含了Microsoft.VisualBasic命名空间,您也可以让它在C#中工作,但我不建议在C#或VB.NET中使用该方法。这是您应该采取的做法(阅读起来更加容易):

tAvailableDate = DateTime.Now.AddDays(21);

那个完美地运作了。谢谢。作为跟进,我还有一个SQL字符串(仍然是vb6)- Format(tAvailableDate, gDATEFORMAT)。对于C#,我可以简单地这样做 - tAvailableDate . ? - eric_13
要将DateTime对象转换为字符串,可以使用ToString方法,例如:tAvailableDate.ToString(gDATEFORMAT) - Steven Doggart

11

我的VB6有点生疏,但如果我没记错的话,您想要加上21天。那么这是您需要做的:

tAvailableDate = DateTime.Now.AddDays(21);

更新

你提到你将变量从string类型转换为DateTime类型。如果你需要将其转换回string类型(根据另一个评论看起来是这样),那么你需要调用:

tAvailableDate.ToString("[format string]");

如果需要帮助让您的字符串格式化成您想要的样式,请参见:http://msdn.microsoft.com/en-us/library/az4se3k1.aspx


2
+1。使用格式化转换为字符串,然后尝试添加天数是没有意义的。可以将天数添加到日期中,但不能添加到字符串中。可能在VB6中可以工作,因为VB6会自动将字符串转换回“日期”,从而掩盖了这个错误!但是,如果它使用与“gDATEFORMAT”中指定的不同文化进行转换,则可能会产生错误(例如,倒置天数和月份)。 - Olivier Jacot-Descombes
谢谢你的帮助。那段代码完美地运行了。为了在编写C#代码时避免VB6中的格式问题,我将tAvailable日期声明为DateTime而不是字符串。 - eric_13
作为后续,我还有一个 SQL 字符串(仍然是 VB6)- Format(tAvailableDate, gDATEFORMAT)。对于 C#,我可以简单地将其制作为 - tAvailableDate.? - eric_13

0
我仔细思考了一下你的问题,发现昨天有一个方面是我忽略了的。我认为“格式”函数没有意义,但即使看起来奇怪,它也可以有意义。让我解释一下。
在VB6中,我们有
tAvailableDate = DateAdd("d", 21, Format(Now, gDATEFORMAT)) 

为什么看起来很奇怪(甚至是错误的)?Now 是一个 DateFormat 将此日期转换为字符串(确切地说是包含字符串的 Variant),但 DateAdd 需要一个 Date 参数才能添加天数。 DateAdd 的声明如下:
Function DateAdd(Interval As String, Number As Double, Date)

V6B会将字符串静默转换为Date并传递给DateAdd,而不是发出警告或编译器错误。因此,我的第一个假设是仅删除此Format

但是,根据gDATEFORMAT的定义方式,此Format可能会对结果产生期望的影响。如果gDATEFORMAT只包含日期部分,则格式函数将删除时间部分!但是,这可以通过在VB6中使用Date函数而不是Now函数来轻松实现。

tAvailableDate = DateAdd("d", 21, Date) 

或者在 .NET (C# 或 VB.NET) 中使用 DateTime.Today

但是 gDATEFORMAT 只能包含月份和年份。在 VB6 中(使用我的瑞士语言环境):

Date   ==>  27.06.2012
Format(Date,"MM.yyyy")   ==>  "06.2012"
CDate(Format(Date,"MM.yyyy"))   ==>  01.06.2012

正如您所看到的,格式化日期将会返回当前月份的第一天。在这种情况下,加上21天,您总是会得到当前月份的22日。这与将21天添加到当前日期相当不同!在C#中,您可以通过以下方式实现相同的效果:

DateTime today = DateTime.Today;
tAvailableDate = new DateTime(today.Year, today.Month, 22);

为了决定哪种方法是正确的,你必须要么知道gDATEFORMAT的内容,要么如果它是一个变量,那就格式化日期然后解析得到的字符串再次获得一个日期。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接