【问题标题】:Calculating wage by hours worked按工作时间计算工资
【发布时间】:2024-01-16 07:25:01
【问题描述】:

大家好,我正在研究如何计算员工下班时的工资。这是我目前使用的代码:

 Dim theStartTime As Date
 Dim theEndTime As Date
 Dim totalTime As String

 theStartTime = "16:11:06"
 theEndTime = "18:22:01"
 totalTime = Format(CDbl((theEndTime - theStartTime) * 24), "#0.0")

所以工作时间是:2h 11m

现在,使用上面的计算代码,我得到 2.2。我需要添加什么才能让它计算 2:11 而不是 2:20 的正确时间?

大卫

【问题讨论】:

  • 2 小时 11 分钟非常接近 2.2 小时。 (关闭一分钟)。
  • 如果你做了#0.00,你可能会看到它类似于 2.18
  • 啊,是的,放置#.## 效果更好。但是当它应该给2h 11m时它仍然给我2h 18m?所以它给了他们额外的 7 分钟不工作的时间。

标签: math datetime vb6


【解决方案1】:

请注意,2.2 小时不是 2:20,而是 2:12。

改变

Format(CDbl((theEndTime - theStartTime) * 24), "#0.0")

Format(theEndTime - theStartTime, "h:mm")

您得到了正确的值,只是在打印时将其四舍五入。 theEndTime - theStartTime 是一个时间跨度,等于两次之差。正如您所发现的,将其乘以 24 会得到不同的小时数。但是,您必须再次除以 24 才能使用日期/时间格式。

查看format dates and time in VB6的所有方法。

【讨论】:

  • 我如何将工资添加到 2:11 的输出中?工资是 10.50。
  • 等到你不得不考虑加班。考虑到规则因地点而异,在某些情况下因星期几而异,这真是一团糟。
  • paycheck = (theEndTime - theStartTime) * 24 * wage。我希望这是一个项目,而不是你真正要在你的业务中使用的东西。不要忘记夏令时之类的事情,因为我不确定(theEndTime - theStartTime) 将如何处理。
【解决方案2】:

您还应该尝试将其转换为可以表示所有数值的Currency 类型(在小数点左侧 4 位和右侧 15 位内)

Format(CCur((theEndTime - theStartTime) * 24), "#0.00")

【讨论】:

  • 这里的问题不是四舍五入,而是表示。
  • @Daniel - 我不是这么说的吗?
  • 抱歉 - 我的评论措辞有误;问题是输出的格式。转换为 Currency 并不能解决 2.2 小时不是 2:20 的问题。
  • @Daniel - 对于这种特定情况,但如果输出是 2.1 不能适当地表示为双精度怎么办?
  • 是的,但是 OP 正在寻找精确到分钟的准确性 - 我认为 Currency 不值得麻烦。
【解决方案3】:

首先,我强烈建议尽可能使用 .NET 框架(带有易于使用的 TimeSpan 类)。

但是,在 VB6 中,您应该可以使用 DATEDIFF 函数(我接触 VB6 已经很多年了,所以具体的语法可能有点偏离

Dim iHours As Integer, iMins As Integer
iMins = DateDiff("n", theStartTime, theEndTime)
iHours = iMins / 60
iMins = iMins Mod 60

【讨论】:

  • 我们中的一些人没有将所有旧软件升级到 .Net 的奢侈。 (虽然如果可能的话我也会推荐它。)
  • 我希望 iMins 有 11 个,iHours 有 2 个。