将DateAdd和格式代码从VB6转换为C#

时间:2012-06-26 13:51:59

标签: c# vb6 vb6-migration

我在vb中有以下代码 -

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

我试图将其转换为C#。

到目前为止我已将此转换为

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

但我无法找到DateAdd()Format()功能的替代品。

有什么想法吗?感谢。

3 个答案:

答案 0 :(得分:12)

DateAdd是一个旧的VB6方法,它被转移到VB.NET中以实现向后兼容。如果在C#项目中包含Microsoft.VisualBasic命名空间,也可以在C#中使用它,但我不建议在C#或VB.NET中使用该方法。这是你应该怎么做(它也更容易阅读):

tAvailableDate = DateTime.Now.AddDays(21);

答案 1 :(得分:11)

我的VB6有点生疏,但如果我记得,你试图增加21天。所以这就是你想要做的事情:

tAvailableDate = DateTime.Now.AddDays(21);

<强>更新

您提到您已将变量从DateTime转换为string。如果您需要将其恢复为string(看起来您可能来自其他评论),那么您想要致电:

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

有关格式化字符串的帮助,请参阅:http://msdn.microsoft.com/en-us/library/az4se3k1.aspx

答案 2 :(得分:0)

我已经考虑过你的问题了,我昨天错过了一个方面。我认为Format函数没有任何意义,但是,即使它看起来很奇怪,它也是有道理的。让我解释一下。

在VB6中我们有

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

为什么它看起来很奇怪(甚至是错误的)? NowDateFormat将此日期转换为String(以及Variant,其中包含String,但DateAdd需要Date参数为了能够添加天数。 DateAdd声明如下:

Function DateAdd(Interval As String, Number As Double, Date)

VB6静默地将此字符串转换回Date并将其传递给DateAdd,而不是发出警告或编译器错误。所以我的第一个假设是放弃Format

但是这个Format会对结果产生预期的影响,具体取决于gDATEFORMAT的定义方式。如果gDATEFORMAT仅包含日期部分,则格式化功能将删除时间部分!但是,这可以通过使用Date函数而不是使用VB6中的Now函数来实现。

tAvailableDate = DateAdd("d", 21, Date) 
.NET中的

DateTime.Today(C#或VB.NET)。

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包含什么,或者如果这是可变的,则格式化日期,然后解析结果字符串以再次获得日期。