我在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 AM和06:30 PM。这给我值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
格式吗?
答案 0 :(得分:3)
您遇到的问题是整数除法,正如您在评论中所告诉的那样。也就是说,将整数除以整数将始终得出整数。这就是C#中的工作方式。要使双精度数作为最终值,操作数之一必须是双精度数。在这种情况下,您可以通过指定/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
的分钟总数-在这种情况下,自我们的{ {1}}代表9个小时或540分钟。
加法和减法非常简单。不过要注意的是,该除法现在是一个双精度整数除以整数,因此结果将是一个双精度整数,因此不会像原始代码那样丢失小数部分。