我在vb:中有这段代码
dim d As Object
d = CDec((DateDiff("n", Format(StartTime), "hh:mm tt"), Format(EndTime), "hh:mm tt")) + 1) / 60)
这里,StartTime
和EndTime
是Date
,值是上午09:30和下午06:30。这给了我值9.01666666666667
当我在C#中转换时:
object d;
d = decimal.Parse(((DateAndTime.DateDiff("n", StartTime.ToString("hh:mm tt"), EndTime.ToString("hh:mm tt")) + 1) / 60).ToString());
这里,StartTime
和EndTime
是DateTime
,值是09:30和18:30。这使我的值为9。我没有十进制值。我缺了什么吗?是因为EndTime
是24小时DateTime
格式吗?
正如您在评论中所说,您遇到的问题是整数除法。这是一个整数除以一个整数,结果总是一个整数。这就是c#中的工作方式。要将double作为最终值,其中一个操作数必须是double。在这种情况下,您可以通过指定/60.0
来完成此操作。
然而,如果转换为c#,您还可以使用比这种直接翻译更好的代码。以下是一些执行相同操作的代码(由于您已经有了Date对象,因此前两行将在您的代码中省略)。
var startTime = new DateTime(2019,1,11,9,30,0);
var endTime = new DateTime(2019,1,11,18,30,0);
var d = ((endTime-startTime).TotalMinutes+1)/60;
Console.WriteLine(d);
输出:
9.01666666666667
并将其分解:
endTime-startTime
-在c#中,您可以从另一个对象中减去一个DateTime
对象,得到一个TimeSpan
对象。
.TotalMinutes
-Timespan
具有TotalMinutes
属性,该属性是表示该Timespan
的总分钟数的两倍,在这种情况下返回540,因为我们的Timespan
表示9小时或540分钟。
加法和减法非常简单。不过需要注意的是,除法现在是一个被整数整除的二重,所以结果将是一个二重,因此不会像原始代码那样丢失小数部分。