我试着找出Java语言中的时间差(HH:mm:ss.SSS),在Java语言中,每个时间可以超过24小时。SimpleDateFormat不支持大于24小时的时间。
例如,
时间A= 36:00:00.00
时间B= 23:00:00.00
我想得到13:00:00.00的答案。(13小时)。
有没有人知道是否有任何Java库可以执行减法。我还想知道是否可以使用Java库添加时间。
发布于 2011-06-14 04:38:36
你不需要第三方库
这是简单的数学运算,看起来与Date DateTime或Timestamp实例没有任何直接关系,但看起来确实与interval相关,并且具有java.util.concurrent.TimeUnit的JDK >= 1.5中内置的功能可以在不引入任何依赖项的情况下处理这种类型的数学运算。
这是解析您的输入并将其转换为毫秒的代码,然后您可以将其转换回您想要的任何String格式,我很方便地选择了您所要求的格式。
java.util.concurrent.TimeUnit是一个隐藏的小宝石,大多数人不知道它是如何偷偷进入1.5的。这个类被埋没在java.util.concurrent包中,似乎没有人知道它,这是一种犯罪。
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main
{
private static long parseInterval(final String s)
{
final Pattern p = Pattern.compile("^(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})$");
final Matcher m = p.matcher(s);
if (m.matches())
{
final long hr = Long.parseLong(m.group(1)) * TimeUnit.HOURS.toMillis(1);
final long min = Long.parseLong(m.group(2)) * TimeUnit.MINUTES.toMillis(1);
final long sec = Long.parseLong(m.group(3)) * TimeUnit.SECONDS.toMillis(1);
final long ms = Long.parseLong(m.group(4));
return hr + min + sec + ms;
}
else
{
throw new IllegalArgumentException(s + " is not a supported interval format!");
}
}
private static String formatInterval(final long l)
{
final long hr = TimeUnit.MILLISECONDS.toHours(l);
final long min = TimeUnit.MILLISECONDS.toMinutes(l - TimeUnit.HOURS.toMillis(hr));
final long sec = TimeUnit.MILLISECONDS.toSeconds(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min));
final long ms = TimeUnit.MILLISECONDS.toMillis(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec));
return String.format("%02d:%02d:%02d.%03d", hr, min, sec, ms);
}
public static void main(final String[] args)
{
final String s1 = "36:00:00.000";
final String s2 = "23:00:00.000";
final long i1 = parseInterval(s1);
final long i2 = parseInterval(s2);
System.out.println(formatInterval(i1 - i2));
}
}输出为
13:00:00.000我假设你的意思是最后一个数字是milliseconds,它应该有3位数字的分辨率。
发布于 2011-06-14 06:01:30
这是一个使用JodaTime的完整解决方案。我敢说,使用java.util或java.util.concurrent apis没有比这更简单、更优雅的方法来实现这一点:
public static int getHoursBetween(final String date1, final String date2){
final DateTimeFormatter fmt =
DateTimeFormat
.forPattern("HH:mm:ss.SS")
.withChronology(
LenientChronology.getInstance(
GregorianChronology.getInstance()));
return Hours.hoursBetween(
fmt.parseDateTime(date1),
fmt.parseDateTime(date2)
).getHours();
}(LenientChronology确保支持像38:00:00.00这样的值)
发布于 2011-06-14 04:13:21
看看Joda-Time,它是一个完整的库,用于处理Java语言中的时间和日期,包括间隔上的算术。
https://stackoverflow.com/questions/6335764
复制相似问题