2014-01-31 119 views
2

我具有毫秒值並且想要顯示時間從hh:mm:ss格式的當前毫秒值中減去5分鐘。格式化毫秒爲hh:mm:ss格式

代碼

String str = String.format("%02d:%02d:%02d", 
           TimeUnit.MILLISECONDS.toHours((cal.getTimeInMillis()-300000)), 
           TimeUnit.MILLISECONDS.toMinutes(cal.getTimeInMillis()-300000) - 
           TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(cal.getTimeInMillis()-300000)), 
           TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis()-300000) - 
           TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(cal.getTimeInMillis()-300000))); 

Toast.makeText(getApplicationContext(), "Alarm Set."+str, Toast.LENGTH_LONG).show() 

輸出現在

Alarm Set. 386467:25:00

輸出所需

Alarm Set. 07:25:00

正如你所看到的minutesseconds正在檢索安靜的權利,但有一些問題hours

P.S

1.I簡稱this post。他們說,它的工作原理fine.But不知道爲什麼沒有我的情況。

2.我肯定什麼,我希望得到儘可能小時值即07,因爲我已設置使用Calendar.HOUR的價值和其越來越顯示太多,如果我使用cal.get(Calendar.HOUR) .CAL是Calendar類的當然對象。

替代解決方案

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss"); 
String str1 = sdf.format(new Date(cal.getTimeInMillis()-300000)); 
Toast.makeText(getApplicationContext(), "Alarm Set."+str1, Toast.LENGTH_LONG).show(); 
+0

使用SimpleDateFormat的,因爲我看到有人建議。然後只是格式化你的時間 - 適當的毫米數。 – user1676075

+0

我確實使用了這個,並解決了這個問題。謝謝。但仍然想知道這段代碼中的問題是什麼,因爲別人說這個工作正常。 –

+1

寫入的解決方案不起作用。舉例來說,只是第一個小時的價值。如果當前時間是小時後2秒,它仍然會顯示當前小時,因爲您沒有從小時值中減去任何時間。幾分鐘呢?如果當前的分鐘數是2,而你減去5,那麼它會給你帶來什麼?正確的做法是以毫秒爲單位,減去5分鐘,然後輸出值。這應該是有效的。但即使如此,使用SimpleDateFormat更有意義。 – user1676075

回答

2

它工作正常,您看到如此巨大的偏移的唯一原因是因爲它計算自UNIX紀元以來的總小時數。

當你做一個Calendar.getInstance()它會讓你獲得當前的時間點。將其轉換爲毫秒是UNIX紀元以來的總毫秒數。

可以檢查的總小時數從epoch:

//Check for the hours since the UNIX Epoch 
System.out.println(System.currentTimeMillis()/3600000); 

輸出:

386439 

您代碼下面也將產生這個結果與的分和秒所附當前時間點:

Calendar cal = Calendar.getInstance(); 

String str = String 
     .format("%02d:%02d:%02d", 
       TimeUnit.MILLISECONDS.toHours((cal.getTimeInMillis() - 300000)), 
       TimeUnit.MILLISECONDS.toMinutes(cal.getTimeInMillis() - 300000) 
         - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS 
           .toHours(cal.getTimeInMillis() - 300000)), 
       TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis() - 300000) 
         - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS 
           .toMinutes(cal.getTimeInMillis() - 300000))); 

System.out.println(str); 

輸出:

386439:38:20 

注:您的參考示例考慮米利斯的恆定值(360萬),因此它變得可讀時間那裏。

更好的解決方案在另一個答案中提供,它提供了您的要求。

+0

這就是他們所說的極好的解釋。你是一個寶石。感謝你解釋很多。 –

+0

@Sash_kp很高興爲你工作 – PopoFibo

+0

謝謝。如果我不討厭你可以請你看看[這篇文章](http://stackoverflow.com/questions/21488830/confusion-regarding-number-of-alarms-需要即將設置)! –

4

檢查這個解決方案。它更優雅

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); 
String str = sdf.format(new Date(System.currentTimeMillis())); 
Toast.makeText(getApplicationContext(), "Alarm Set."+str, Toast.LENGTH_LONG).show() 
+0

謝謝你的建議。它只是稍作修改,即'HH:mm:ss'到'hh:mm:ss'。我承認它比另一個更優雅。但我只是想知道那裏有什麼問題在該片段中。 –

1

使用Joda-Time庫使這項工作更容易。

// Note that milliseconds-since-epoch needs to be a "long" rather than an "int". 
long millis = new DateTime().getMillis(); 

// Specify a time zone rather than rely on default. 
DateTimeZone timeZone = DateTimeZone.forID("Asia/Kolkata"); // Formerly known as Calcutta India. 

// Instantiate a DateTime object from number of milliseconds since Unix epoch. 
DateTime dateTime = new DateTime(millis, timeZone); 

// Go back 5 minutes. 
DateTime dateTimeEarlier = dateTime.minusMinutes(5); 

// Get a formatter to render a string of the time portion. 
DateTimeFormatter formatter = ISODateTimeFormat.hourMinuteSecond(); 

// Use the formatter to create a string. 
String output = formatter.print(dateTimeEarlier); 

轉儲到控制檯...

System.out.println("millis: " + millis); 
System.out.println("dateTime: " + dateTime); 
System.out.println("dateTimeEarlier: " + dateTimeEarlier); 
System.out.println("output: " + output); 

當運行...

millis: 1391391422174 
dateTime: 2014-02-03T07:07:02.174+05:30 
dateTimeEarlier: 2014-02-03T07:02:02.174+05:30 
output: 07:02:02 
相關問題