我创建J2SE应用程序和本应用程序需要以毫秒为单位两次格式化成表示这两个时间之间的间隔的字符串。
long time1 = 1334331041677L; //Fri Apr 13 17:30:41 CEST 2012
long time2 = time1+1000*60*2; //Fri Apr 13 17:32:41 CEST 2012
我想获得类似“00:02:00”。 这将是简单的,但我需要的时间间隔是从长几秒钟格式化长达数年 - 所以图书馆应处理它。 理想地是,如果这个库可以根据国家(如果有的话)的习惯所格式化的时间间隔。
我已经搜索throught的问题和答案和解决方案对我来说可能是Jodatime或Lang库从Apache的百科全书。 你能否提供我一些建议,该建议库从这些解决了更好的办法我的要求是什么? 先感谢您。
PeriodFormat
在约达时间 可能是你想要的东西-但你需要非常仔细地想想你要如何格式化的超过一天的时间值。 请记住,几个月甚至几年都是可变长度的 - 如果你很高兴有最大的单位为一天,那很可能让事情变得简单。
你也应该知道之间的乔达时间差的Period
(可能包括像“月”的东西)和Duration
是毫秒的固定数。 上基本上完全相同:)上面提到的问题,两个触摸关系正常化,就应该工作,你是否有兴趣在两个时间瞬间之间经过的时间差,或者两个本地日期/时间之间的“日历”时间差值。 例如,午夜和上午02点上在特定时间区中的特定日期之间可以是1小时,2小时或3个小时的经过时间...
您可以使用标准的Java Calendar
的时间间隔最多时一天(24小时)。 这是不可能用这一招更长的时间(天,年),但...
long start = System.currentTimeMillis();
/*
* perform the measured activity here,
* let's say it will take 2 minutes 5 seconds => 125 seconds => 125000ms
*/
Thread.sleep(125 * 1000);
long stop = System.currentTimeMillis();
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
c.setTimeInMillis(c.getTimeInMillis() + (stop - start));
DateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");
System.out.println(df.format(c.getTime()));
如果我理解正确的话,下面的(使用约达时间)应该帮助
import org.joda.time.DateTime;
import org.joda.time.Period;
private String formatDuration(DateTime dt1, DateTime dt2) {
Period period = new Period(dt1, dt2);
String str = String.format("%s:%02d:%02d:%02d:%02d:%02d",
period.getYears(), period.getMonths(), period.getDays(),
period.getHours(), period.getMinutes(), period.getSeconds());
// Ignoring milliseconds
String[] tokens = str.split(":");
boolean currNonZero = false, flag = false, isFirst = true;
int ctr = 0, pos = 0;
StringBuilder sb = new StringBuilder();
for (String token : tokens) {
pos++;
int val = Integer.parseInt(token);
currNonZero = (val > 0);
if ((ctr < 3 && (flag || currNonZero)) || (ctr == 0 && pos > 3)) {
if (isFirst) { isFirst = false; }
else { sb.append(":"); }
sb.append(token);
flag = (++ctr < 3);
}
}
return sb.toString();
}
几个测试,
DateTime dt1 = new DateTime(2012, 1, 1, 8, 3, 5, 0);
DateTime dt2 = new DateTime(2012, 1, 2, 9, 5, 6, 0);
DateTime dt3 = new DateTime(2012, 2, 3, 11, 3, 5, 0);
DateTime dt4 = new DateTime(2012, 2, 3, 11, 3, 10, 0);
DateTime dt5 = new DateTime(2012, 2, 3, 11, 3, 10, 5); //5 millis away from dt4
formatDuration(dt1, dt2); // Returns "01:01:01"
formatDuration(dt1, dt3); // Returns "01:02:03"
formatDuration(dt3, dt4); // Returns "00:00:05"
formatDuration(dt4, dt5); // Returns "00:00:00"
根据这个答案 ,这是格式化经过时间的最有效的方法:
public static String combinationFormatter(final long millis) {
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis)
- TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis));
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis)
- TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis));
long hours = TimeUnit.MILLISECONDS.toHours(millis);
StringBuilder b = new StringBuilder();
b.append(hours == 0 ? "00" : hours < 10 ? String.valueOf("0" + hours) :
String.valueOf(hours));
b.append(":");
b.append(minutes == 0 ? "00" : minutes < 10 ? String.valueOf("0" + minutes) :
String.valueOf(minutes));
b.append(":");
b.append(seconds == 0 ? "00" : seconds < 10 ? String.valueOf("0" + seconds) :
String.valueOf(seconds));
return b.toString();
}
详细的解答: https://stackoverflow.com/a/39600534/5330578
简单的格式为经过的时间少于24小时。 在24小时的代码将只在第二天显示小时,并不会经过一天添加到小时。
public static String formatElapsedTime(long milliseconds) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
return sdf.format(milliseconds);
}