String time1 = br.readLine();
DateFormat sdf = new SimpleDateFormat("hh:mm:ss",Locale.ENGLISH);
Date d1 = sdf.parse(time1);
int n = Integer.parseInt(br.readLine());
for(int i=0;i<n;i++) {
String time2 = br.readLine();
Date d2 = sdf.parse(time2);
long diffMs = d1.getTime() - d2.getTime();
System.out.println(diffMs/(1000*60*60));
输入:
time1 = 23:05:38
time2 = 12:36:07
输出应 10 ,但它会 22 。
答案 0 :(得分:1)
首先,我假设计算发生在没有夏令时(DST)和其他异常的时区,或者至少在没有过渡的日期。
我遗漏了BufferedReader
的阅读,因为你似乎已经处理好了。
String time1 = "23:05:38";
LocalTime t1 = LocalTime.parse(time1);
String time2 = "12:36:07";
LocalTime t2 = LocalTime.parse(time2);
Duration diff = Duration.between(t2, t1);
System.out.println(diff.toHours());
这会打印预期的
10
正如您所看到的,我正在the comment中关注Deb的建议:使用modern Java date and timeAPI known as JSR-310 or java.time
。这会自动解决您的问题,因为LocalTime
在没有任何明确格式化的情况下在24小时制解析您的时间,因此无法在格式模式字符串中使用错误的大小写。
这是对的,我同意d.j.brown你的模式中的小写hh
是罪魁祸首。您的时间被解释为23:05:38 AM,这是无稽之谈,但过时的SimpleDateFormat
只是意味着晚上11:05:38,即24小时制23:05:38,是你所期待的。恕我直言,让你在不告诉你的情况下逃脱这样的错误是非常讨厌的。你很幸运有一个以“12”开头的时间,因为12:36:07 AM意味着在24小时时间0:36:07,所以这次你得到了错误的结果并且意识到出了什么问题。否则你的bug会被忽视,也许很长一段时间。这个带有士气的长篇故事:远离SimpleDateFormat
。
问题:我可以在Java版本中使用现代API吗?
如果至少使用Java 6 ,则可以。