-1

我正在编写一个将分钟添加到时间字符串的函数 - 不使用任何时间库。该函数有两个参数 -

  1. 第一个,“时间”([H]H:MM AM|PM)字符串,格式类似于12:00 AM3:30 PM(12 小时制,无(24 小时制)军用时间输入
  2. 第二,整数参数(正或负)为分钟,即200

一切都很好,直到我遇到添加分钟。例如,当第一个参数输入为02:00 AM,第二个参数输入为时,我可以得到正确的答案-180,这应该产生11:00 PM的答案

我使用的算法是获取我的输入字符串“时间”/第一个参数,即02:00 AM,并将其转换/映射为军事时间(24 小时制)以进行所有计算(因此我不必跟踪 AM 或PM),然后我将整个事情转换为minutes,然后我转换为hours并取 %(模)和 24(因为 1 天是 24 小时)得到HOURS部分答案,我使用之前计算的分钟和 %(模) 用 60 得到答案的MINUTES部分。

在此示例中,我在上面给出的 (02:00 AM) 和 (-180) 将导致:

  1. 02:00AM == 120 分钟
  2. 添加 120 分钟 + (-180) 分钟 = -60 分钟
  3. 将分钟(即 60)转换为小时 = -1 小时
  4. 使用Math.floorMod(-1,24)= 23,得到答案的小时部分。使用只是%给了我错误的答案1......
  5. 使用 -60 % 60 = 0,得到答案的MINUTES部分。常规 % 运算符在这里工作正常
  6. 连接小时 + 分钟 + AM/PM 以返回类似的字符串11:00 PM

我一直在使用Math.floorMod(x,y),因为常规的模%运算符对我不起作用,当减去并以负数结束时,我需要取模。我现在正在尝试不同的输入9:13 AM,例如-720(半天)和-1440(全天)分钟,现在我得到了一些错误的答案。

似乎在使用此模数算法将分钟添加到时间时,我总是得到正确的答案。现在我是否必须做一些不同的事情,因为我实际上是在减去分钟并且可能以负数结束,我以 24 取模?

请告诉我。

4

1 回答 1

2

恐怕你仍然会得到负分钟数。例如,您可以尝试添加 -135 分钟而不是 -180 分钟,看看会发生什么。

我认为你会更好地扭转操作:

  1. 首先使用Math.floorMod(-60, 24 * 60)分钟来获得 1380。
  2. 然后将 1380 分钟转换为 23 小时。

这应该确保分钟也不能为负数。

否则我认为你很好。

PS 从评论中重复我自己:对于生产代码使用LocalTimejava.time ,现代 Java 日期和时间 API用于一天中的时间,并使用它的plusMinutesminusMinutes方法来增加和减少分钟。这两种方法都接受正数和负数分钟数。

于 2020-11-01T11:33:03.780 回答