2015-04-17 59 views
3

我正在使用String.format打印已用时间。这是工作伟大的几分钟:秒...String.format打印错误时间

long millis = 330000; 
String.format("%tMm%tSs", millis, millis); 

...将打印05m30s。

但是,当我尝试在经过的时间中包含小时数时,小时数显示为19!起初,我认为这是我的场所,但我已经尝试了以下...

long millis = 330000; 
String.format(Locale.ITALY, "%tHh%tMm%tSs", millis, millis, millis); 

...我仍然得到19h05m30s。

你甚至可以尝试

long millis = 0; 
String.format(Locale.ITALY, "%tHh", millis); 

,但你仍然可以得到19小时。

发生了什么事?

+0

你是什么意思的“当我尝试在我的经过时间包括小时”? – 2015-04-17 12:59:24

+0

对不起,我在格式字符串中忘了格式化程序。我编辑了这个问题。 – naugler

+0

我为第二个人获得'01h05m30s' – Sionnach733

回答

1

long的值被视为java.util.Date,而不是持续时间。这就是时区影响它的原因。您的毫秒值等于表示1970年1月1日00:05:30的日期UTC

尝试制作相对于午夜的时间在本地时区:

long millis = 330000; 

System.out.printf("%THh%<tMm%<tSs%n", millis); 

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 

cal.add(Calendar.MILLISECOND, (int) millis); 

System.out.printf("%THh%<tMm%<tSs%n", cal); 
+0

谢谢,这是根本问题。我知道它会将价值看作是一个日期,但我想要表示1970年1月1日00:05:30(小时,分钟和秒仍然只是从1970年1月1日00:00:00开始经过的时间)但是我不知道时区的处理方式。看到我自己的答案。 – naugler

-1

检查modifiers,几小时这是tl不是tHh

+0

H是24小时制的小时的有效修饰符,我想在小时后打印字母“h” – naugler

+0

结果相同,但'3h05m30s'而不是'03h05m30s' –

0

Formatter doc

对于长,长,日期使用的时区是Java虚拟机实例的默认时区 。格式器的区域设置 将取代参数的区域设置(如果有的话)。

我猜Locale参数纯粹是为了格式化而不是时间计算。

0

请看下面的例子:

int s = 330; 
System.out.println(String.format("%d:%02d:%02d", s/3600, (s%3600)/60, (s%60))); 

我用秒,但这个例子还将努力为毫秒,但你必须在示例中将每个数字加上000):

+0

不是我问的,但是我最终做了这样的事情来避免时区问题。谢谢你的帮助。 – naugler

1

Joda-Time

库有一些类可以智能地处理一段时间,让你避免处理毫秒。

ISO 8601

ISO 8601标准定义类似于你要使用什么样的格式。 Joda-Time库默认使用ISO 8601格式来解析和生成这样的字符串。

不要那么辛苦

换句话说,你正在努力工作。让Joda-Time 2.7在这里完成这项工作。

更好地指定您想要的时区,而不是隐式地依赖JVM的当前默认时区(可能会随时改变)。

使用proper time zone names。切勿使用既不标准也不唯一的3或4字母代码。

DateTimeZone zone = DateTimeZone.forID ("Europe/Rome"); 

通过捕获当前时刻假冒一些数据,然后回退几小时,几分钟和几秒钟。

DateTime now = DateTime.now (zone); 
DateTime then = now.minusHours(19).minusMinutes(5).minusSeconds (30); 

以两种方式表示一段时间。首先是时间线上的一对固定点。其次,一些月,日,小时等

Interval interval = new Interval(then, now); // String representation defaults to the pair of date-time values displayed in ISO 8601 format. 
Period period = interval.toPeriod(); // String representation defaults to ISO 8601 format of PnYnMnDTnHnMnS. 

注意,PeriodtoString方法默认生成与你相似的ISO 8601标准格式,PnYnMnDTnHnMnS的字符串。 P标志着开始,而T将日期部分与时间部分分开。

转储到控制台。

System.out.println ("interval: " + interval); 
System.out.println ("period: " + period); 

运行时。

interval: 2015-04-18T12:16:55.700+02:00/2015-04-19T07:22:25.700+02:00 
period: PT19H5M30S 
+0

非常有帮助的例子,谢谢 – naugler