我想计算两个小时之间的差异。时间格式必须是hh:mm:ss!我实现了这段代码:
public static String timeDifference(long timeDifference1) {
long timeDifference = timeDifference1 / 1000;
int h = (int) (timeDifference / (3600));
int m = (int) ((timeDifference - (h * 3600)) / 60);
int s = (int) (timeDifference - (h * 3600) - m * 60);
return String.format("%02d:%02d:%02d", h, m, s);
}
public static void main(String[] args) throws ParseException {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String timeStart = sc.next();
String timeStop = sc.next();
char lol[]=timeStop.toCharArray();
if(lol[0]=='0' && lol[1]=='0'){
lol[0]='2';
lol[1]='4';
}
String tetx=String.valueOf(lol);
timeStop=tetx;
char kk[]=timeStart.toCharArray();
if(kk[0]=='0' && kk[1]=='0'){
kk[0]='2';
kk[1]='4';
}
String hhh=String.valueOf(kk);
timeStart=hhh;
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
Date d1 = null;
Date d2 = null;
d1 = format.parse(timeStart);
d2 = format.parse(timeStop);
long diff;
if (d1.getTime() > d2.getTime()) {
diff = (int) (d1.getTime() - d2.getTime());
} else
diff = (int) (d2.getTime() - d1.getTime());
System.out.println(timeDifference(diff));
}
}
输入必须是:
10:03:43 15:00:58
13:00:00 14:00:00
00:00:00 12:05:00
12:05:00 00:00:00
输出:
04:57:15
01:00:00
12:05:00
11:55:00
但是我得到了
04:57:15
01:00:00
00:05:00
00:05:00
我该如何解决这个问题?
答案 0 :(得分:4)
不要重新发明轮子。您可以使用java.time
包完成所有这些操作。
一旦我们要求第二个00:00:00
值代表明天,逻辑就变得不那么优雅了。我们需要使用LocalDateTime
并可能添加一天:
private static String getDifference(final String first, final String second)
{
final LocalTime firstTime = LocalTime.parse(first, DateTimeFormatter.ISO_LOCAL_TIME);
final LocalTime secondTime = LocalTime.parse(second, DateTimeFormatter.ISO_LOCAL_TIME);
final LocalDateTime firstDateTime = LocalDateTime.of(LocalDate.now(), firstTime);
final LocalDateTime secondDateTime = LocalDateTime.of(
LocalDate.now().plusDays(second.equals("00:00:00") ? 1 : 0),
secondTime
);
final Duration diff = Duration.between(firstDateTime, secondDateTime).abs();
return String.format(
"%02d:%02d:%02d",
diff.toDaysPart() < 1 ? diff.toHoursPart() : 24,
diff.toMinutesPart(),
diff.toSecondsPart()
);
}
这样打电话:
System.out.println(getDifference("12:05:00", "00:00:00"));
示例输出:
11时55分00秒
请注意,JDK 9中添加了toMinutesPart
及其兄弟方法。逻辑在JDK 8中非常相似,但更详细。
答案 1 :(得分:1)
The answer by Michael很好(+1)。请允许我补充说,您不需要提及任何格式化程序(虽然我也看到了明确格式化的优势)并且您不需要发明一个人为的,可能不正确的日期来处理24:00问题
LocalTime start = LocalTime.parse(timeStart);
LocalTime stop = LocalTime.parse(timeStop);
if (stop.isAfter(start)) { // the normal situation
System.out.println(formatDuration(Duration.between(start, stop)));
} else if (stop.equals(LocalTime.MIDNIGHT)) {
System.out.println(
formatDuration(Duration.between(start, stop).plusDays(1)));
} else {
System.out.println("End time " + timeStop + " was before start time " + timeStart);
}
我假设时间是在同一天,除了00:00:00的结束时间意味着当天结束时的午夜(有时候我称之为24.00)。如果您需要计算,比如从一天的13:00到13:00到第二天的24小时,只需删除第二个if
条件和最后一个else
块。
提供示例输入会显示您要求的输出:
04:57:15
01:00:00
12:05:00
11:55:00
正如迈克尔所提到的,{9}中引入了toMinutesPart
和toSecondsPart
方法。有关如何格式化早期Java版本中的持续时间,请参阅my answer here。
要正确解析24小时制(12:05:00,13:00,6:00:00,15:00:58)的时间,您需要使用大写HH
小时天。小写hh
表示AM或PM从01到12(含)。如果未指定AM或PM,则默认使用AM。所以10:03:43按照你的预期进行解析。有趣的是15:00:58虽然没有15:00:58 AM,但是太平了。 SimpleDateFormat
只是推断。自上午12:05:00起12:05:00出现问题,意味着00:05:00。在我的电脑上我得到了23:55:00(不是00:05:00,正如你所说的那样)。这是因为您首先将开始时间更改为24:00:00,然后计算从00:05:00到24:00:00(即23:55:00)的时间。由于您知道哪个时间是开始时间,哪个是结束时间,因此您可能不应该在它们看起来顺序错误的情况下交换它们。在你的最后一个例子中我也得到了23:55:00。发生的情况是相同的,除了时间没有交换,因为00:05:00已经在24:00:00之前。
答案 2 :(得分:0)
请在SimpleDateFormat中将hh
更改为HH
。这将为您提供24小时格式的结果。 https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
答案 3 :(得分:0)
您可以添加日期来修复它:
np.random.seed(100)
df = pd.DataFrame(np.random.randint(10, size=(3,3)), columns=list('ABC'))
print (df)
A B C
0 8 8 3
1 7 7 0
2 4 2 5
a = np.where(df == 8)
print (a)
(array([0, 0], dtype=int64), array([0, 1], dtype=int64))
b = list(zip(df.index[a[0]], df.columns[a[1]]))
print (b)
[(0, 'A'), (0, 'B')]
输出将是:
12:05:00
11时55分00秒