2010-04-24 8 views
14

मैं मिलीसेकेंड में मुद्रण समय अंतर से परिचित हूँ:जावा में एक समय अंतर मुद्रित करने के लिए सबसे बेवकूफ तरीका?

long time = System.currentTimeMillis(); 
//do something that takes some time... 
long completedIn = System.currentTimeMillis() - time; 

लेकिन, एक अच्छा तरीका एक निर्धारित प्रारूप में एक पूर्ण समय मुद्रित है (जैसे: HH: MM: एस एस) या तो अपाचे कॉमन्स या यहाँ तक कि का उपयोग करते हुए भयभीत मंच एपीआई की तिथि/समय वस्तुओं? दूसरे शब्दों में, जावा में मिलीसेकंड से व्युत्पन्न समय प्रारूप लिखने का सबसे छोटा, सरल, कोई बकवास तरीका क्या नहीं है?

+3

'System.currentTimeMillis() - समय; 'होना चाहिए। –

उत्तर

20

अपाचे कॉमन्स में एक समय अवधि के लिए निर्दिष्ट प्रारूप लागू करने के लिए DurationFormatUtils कक्षा है। तो, कुछ की तरह:

long time = System.currentTimeMillis(); 
//do something that takes some time... 
long completedIn = System.currentTimeMillis() - time; 

DurationFormatUtils.formatDuration(completedIn, "HH:mm:ss:SS"); 
+0

आप इनलाइनों को इनलाइन भी कर सकते हैं: अवधि FormatUtils.formatDuration (System.currentTimeMillis() - समय, "एचएच: मिमी: एसएस: एसएस"); – Liggy

+5

या लगभग समान, अंतर्निर्मित अवधि का उपयोग करें FormatUtils.formatDurationHMS (अंत-प्रारंभ); – JRL

+0

@JRL: 'अवधि FormatUtils.formatDurationHMS (अंत-प्रारंभ); 'प्रश्न में दिए गए उदाहरण को पूरा करेगा, लेकिन मैंने अपने समाधान में मिलीसेकंड जोड़े। –

1

यदि आप वास्तव में एक मिलीसेकंद अंतर देखना चाहते हैं, तो मुझे नहीं लगता कि वहां एक छोटा, सरल तरीका है।

यदि आपको प्रदर्शन आंकड़े एकत्र करने के लिए अधिक शक्तिशाली (लेकिन निश्चित रूप से आसान नहीं) तरीका चाहिए, तो Perf4J है।

1

मेरे ज्ञान के लिए नहीं। लेकिन printf() यह आसानी से कर सकता है यदि आप एच, एम और एस के मानों की गणना करते हैं, और प्रत्येक के लिए% 02 पैटर्न का उपयोग करते हैं।

4

एक उद्देश्य के लिए डिजाइन पुस्तकालय बेहतर दृष्टिकोण है, लेकिन SimpleDateFormat सही TimeZone के साथ एक दिन से भी कम समय के लिए ही पर्याप्त होता। लंबे समय तक विशेष रूप से दिन का इलाज करने की आवश्यकता होती है।

import java.text.DateFormat; 
import java.util.Date; 
import java.text.SimpleDateFormat; 
import java.util.TimeZone; 

public class Elapsed { 

    private static final long MS_DAY = 24 * 60 * 60 * 1000; 
    private final DateFormat df = new SimpleDateFormat("HH : mm : ss : S"); 

    public Elapsed() { 
     df.setTimeZone(TimeZone.getTimeZone("GMT")); 
    } 

    private String format(long elapsed) { 
     long day = elapsed/MS_DAY; 
     StringBuilder sb = new StringBuilder(); 
     sb.append(day); 
     sb.append(" : "); 
     sb.append(df.format(new Date(elapsed))); 
     return sb.toString(); 
    } 

    public static void main(String[] args) { 
     Elapsed e = new Elapsed(); 
     for (long t = 0; t < 3 * MS_DAY; t += MS_DAY/2) { 
      System.out.println(e.format(t)); 
     } 
    } 
} 

कंसोल आउटपुट:

 
0 : 00 : 00 : 00 : 0 
0 : 12 : 00 : 00 : 0 
1 : 00 : 00 : 00 : 0 
1 : 12 : 00 : 00 : 0 
2 : 00 : 00 : 00 : 0 
2 : 12 : 00 : 00 : 0 
0
long diff = System.currentTimeMillis() - startTime; 
int hours = (int)(diff/3600000); diff -= hours * 3600000; 
int mins = (int)(diff/60000); diff -= mins * 60000; 
int secs = (int)(diff/1000); diff -= secs * 1000; 
System.out.println(String.format("%d:%d:%d.%d", hours, mins, secs, diff)); 
+1

यह आउटपुट प्रारूप टूटा हुआ है। –

0

tl; डॉ

Duration.ofMillis(…) 
     .toString() 

आईएसओ 8601

क्या कम से कम, सरल, कोई बकवास WRI के लिए रास्ता है मिलीसेकंड

ISO 8601 मानक डेट-टाइम मानों के लिए पाठ प्रारूपों को परिभाषित करता है। ये प्रारूप वास्तव में छोटे, सरल और बिना बकवास हैं। वे बड़े पैमाने पर विभिन्न संस्कृतियों, व्यावहारिक और स्पष्ट में मानव-पठनीय हैं।

टाइमलाइन से जुड़े समय के लिए, standard formatPnYnMnDTnHnMnS है। P शुरुआत को चिह्नित करता है, और T घंटों-मिनट-सेकंड से वर्षों-महीनों के दिनों को अलग करता है। तो डेढ़ घंटे PT1H30M है।

java.time.Duration

java.time कक्षाएं समय की फैला प्रतिनिधित्व करने के लिए कक्षाओं की एक जोड़ी शामिल हैं। Duration कक्षा घंटे-मिनट-सेकंड के लिए है, और Period वर्षों-महीनों के लिए है।

Duration d = Duration.ofMillis(yourMillisecondsNumberGoesHere); 

जावा.टाइम कक्षाएं पार्सिंग और स्ट्रिंग उत्पन्न करने के लिए डिफ़ॉल्ट रूप से आईएसओ 8601 प्रारूपों का उपयोग करती हैं। Duration और Period कक्षाएं इस विशेष मानक प्रारूप का उपयोग करती हैं। तो बस toString पर कॉल करें।

String output = d.toString(); 

आप इन मानक तारों को पार्स करते हुए दूसरी दिशा में जा सकते हैं।

Duration d = Duration.parse("PT1H30M"); 

java.time

बारे java.time ढांचे जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशान पुराने legacyjava.util.Date, Calendar, & SimpleDateFormat जैसी समय-समय पर कक्षाएं प्रदान करती हैं।

Joda-Time प्रोजेक्ट, अब maintenance mode में, java.time कक्षाओं में माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता JSR 310 है।

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • Java SE 8 और SE 9 और बाद में
    • में निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और सुधारों को जोड़ता है।
  • Java SE 6 और SE 7
    • java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा गया है।
  • Android
    • ThreeTenABP परियोजना adapts ThreeTen-backport विशेष रूप से (जैसा कि ऊपर उल्लेख) Android के लिए।
    • How to use ThreeTenABP… देखें।

ThreeTen-Extra परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval, YearWeek, YearQuarter, और more

संबंधित मुद्दे

 संबंधित मुद्दे