जावा में स्ट्रिंग स्वरूपित समय में मिलीसेकंड में टाइमस्टैम्प परिवर्तित करें


126

मैं एक लंबे मूल्य ( मिलीसेकंड की संख्या 1/1/1970 यानी युग ) से प्रारूप के समय में बदलने की कोशिश कर रहा हूं h:m:s:ms

लंबे समय तक मैं टाइमस्टैम्प के रूप में उपयोग करता हूं, मुझे timestampलॉग 4 जे से लॉगिंग इवेंट के क्षेत्र से मिलता है ।

अभी तक मैंने निम्नलिखित कोशिश की है और यह विफल है:

logEvent.timeStamp/ (1000*60*60)
TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

लेकिन मुझे गलत मूल्य मिले:

1289375173771 for logEvent.timeStamp
358159  for logEvent.timeStamp/ (1000*60*60) 
21489586 for TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

यह कैसे करना है?

जवाबों:


188

इसे इस्तेमाल करे:

Date date = new Date(logEvent.timeSTamp);
DateFormat formatter = new SimpleDateFormat("HH:mm:ss.SSS");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String dateFormatted = formatter.format(date);

अन्य प्रारूप स्ट्रिंग के एक विवरण के लिए SimpleDateFormat देखें जो कक्षा स्वीकार करता है।

1200 एमएस के इनपुट का उपयोग करके रन करने योग्य उदाहरण देखें ।


8
टिप्पणी: एचएच उस तिथि (0-23) पर घंटे प्रिंट करेगा, न कि 1970 के बाद से अब तक के कुल घंटे।
जॉनीटेक्स

4
और मत भूलना। पुराने SimpleDateFormat मल्टीथ्रेडेड का उपयोग नहीं किया जा सकता है।
कीकी

आयात करने के लिए SimpleDateFormat, निम्नानुसार आयात का उपयोग करें:import java.text.*;
नवीन कुमार RB

1
FYI करें, पुरानी पुरानी पुरानी समय की कक्षाएं जैसे कि java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब विरासत है , जावा 8 और बाद में निर्मित java.time कक्षाओं द्वारा ली गई है । ओरेकल द्वारा ट्यूटोरियल देखें । देखें: stackoverflow.com/a/4142428/642706
बेसिल बॉर्क

1
whats के प्रकार logevent? आप सवाल में डाल सकते हैं?
राऊल

127
long millis = durationInMillis % 1000;
long second = (durationInMillis / 1000) % 60;
long minute = (durationInMillis / (1000 * 60)) % 60;
long hour = (durationInMillis / (1000 * 60 * 60)) % 24;

String time = String.format("%02d:%02d:%02d.%d", hour, minute, second, millis);

13
मुझे आपका समाधान स्वीकार किए गए उत्तर से बेहतर लगता है क्योंकि यह थोड़ा अधिक स्पष्ट है और स्थानीय लोगों के साथ समस्याओं का सामना नहीं करता है। यद्यपि आप अंतिम भाग को याद करते हैं: मिलिस = मिलिस% 1000, जो फॉर्मेट स्ट्रिंग के अंत में मिलीसेकंड को सही तरीके से डाल देगा।
ओन्ड्रेज बर्कर्ट

7
@WesleyDeKeirsmaeker, सामान्य रूप से, पठनीयता सहमति से अधिक महत्वपूर्ण है।
अल्फ़ा

2
घंटे के लिए 24 के साथ क्यों शेष है?
बाबू

2
विभाजन सहयोगी नहीं है: 50000 / (1000 * 60) = 0.8333333333 जबकि 50000/1000 * 60 = 3000.
22

3
'मिली = मिलिस% 1000' गायब है: D \ n और अगर आपको दिन चाहिए, तो आप यहाँ जाएँ: 'long days = (millis / (1000 * 60 * 60 * 24));'
अड्रेसस

38

मैं आपको तीन तरीके दिखाता हूँ (ए) एक लंबे मूल्य से मिनट फ़ील्ड प्राप्त करें, और (बी) इसे उस तिथि प्रारूप का उपयोग करें जिसे आप चाहते हैं। एक java.util.Calendar का उपयोग करता है , दूसरा Joda-Time का उपयोग करता है , और अंतिम जावा 8 और बाद में निर्मित java.time फ्रेमवर्क का उपयोग करता है।

Java.time फ्रेमवर्क पुराने बंडल किए गए डेट-टाइम क्लासेस को दबा देता है, और Joda-310 से प्रेरित होता है, जिसे JSR 310 द्वारा परिभाषित किया गया है, और थ्रीटेन-एक्सट्रा प्रोजेक्ट द्वारा विस्तारित किया गया है।

जावा 8 और बाद का उपयोग करते हुए जाने के लिए java.time फ्रेमवर्क है। अन्यथा, जैसे कि Android, Joda-Time का उपयोग करें। Java.util.Date/.Calendar क्लासेस बेहद परेशान करने वाली हैं और इनसे बचना चाहिए।

java.util.Date &। कैलेन्डर

final long timestamp = new Date().getTime();

// with java.util.Date/Calendar api
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timestamp);
// here's how to get the minutes
final int minutes = cal.get(Calendar.MINUTE);
// and here's how to get the String representation
final String timeString =
    new SimpleDateFormat("HH:mm:ss:SSS").format(cal.getTime());
System.out.println(minutes);
System.out.println(timeString);

Joda समय

// with JodaTime 2.4
final DateTime dt = new DateTime(timestamp);
// here's how to get the minutes
final int minutes2 = dt.getMinuteOfHour();
// and here's how to get the String representation
final String timeString2 = dt.toString("HH:mm:ss:SSS");
System.out.println(minutes2);
System.out.println(timeString2);

आउटपुट:

24
09: 24: 10: 254
24
09: 24: 10: 254

java.time

long millisecondsSinceEpoch = 1289375173771L;
Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , ZoneOffset.UTC );

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "HH:mm:ss:SSS" );
String output = formatter.format ( zdt );

System.out.println ( "millisecondsSinceEpoch: " + millisecondsSinceEpoch + " instant: " + instant + " output: " + output );

मिलीसेकंडसइंस्टोक: 1289375173771 इंस्टेंट: 2010-11-10T07: 46: 13.771Z आउटपुट: 07: 46: 13: 771


1
क्या कोई प्रदर्शन कारण या कोई अन्य कारण है, मुझे कैलेंडर पर जोडा का शिकार करना चाहिए?
क्रेटाइलस

1
इस तरह के मामलों में, नहीं। सामान्य तौर पर: Joda का एपी बेहतर डिज़ाइन किया गया है। उदाहरण के लिए जावा डेट्स परस्पर जुदा हैं डेटटाइम्स नहीं हैं। Joda भी अधिक प्रोग्रामर फ्रेंडली है, आप DateTime और कैलेंडर के बीच तारीख और समय को बदलने के बिना DateTime वर्ग से लगभग सभी कार्यक्षमता तक पहुँच सकते हैं
सीन पैट्रिक फ्लोयड

क्या इसकी कोई निर्भरता है जो मुझे पता होनी चाहिए?
क्रेटिलस

2
अच्छा जवाब है, लेकिन मेरा सुझाव है कि जेवीएम के वर्तमान डिफ़ॉल्ट समय क्षेत्र पर निर्भर होने के बजाय समय क्षेत्र को निर्दिष्ट करना। इसलिए डेटटाइम के निर्माता के पास कॉल का दूसरा तर्क होगा, एक DateTimeZoneऑब्जेक्ट। इस तरह:new DateTime( timestamp, DateTimeZone.forID( "America/Montreal" ) )
तुलसी बोर्क

2
@Cratylus java.time वर्गों को प्रतिस्थापित दोनों Joda समय और पुराने विरासत तिथि-समय जावा के साथ बंडल कक्षाएं। जोडा-टाइम ने java.time कक्षाओं को प्रेरित किया, दोनों परियोजनाएं एक ही आदमी के नेतृत्व में स्टीफन कॉलबोर्न।
बेसिल बोर्के

22

अपाचे कॉमन्स (कॉमन्स-लैंग 3) और इसकी अवधिफोरमैट यूटिल्स क्लास का उपयोग करना संभव है।

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.1</version>
</dependency>

उदाहरण के लिए:

String formattedDuration = DurationFormatUtils.formatDurationHMS(12313152);
// formattedDuration value is "3:25:13.152"
String otherFormattedDuration = DurationFormatUtils.formatDuration(12313152, DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN);
// otherFormattedDuration value is "P0000Y0M0DT3H25M13.152S"

आशा है कि यह मदद कर सकता है ...


8
long second = TimeUnit.MILLISECONDS.toSeconds(millis);
long minute = TimeUnit.MILLISECONDS.toMinutes(millis);
long hour = TimeUnit.MILLISECONDS.toHours(millis);
millis -= TimeUnit.SECONDS.toMillis(second);
return String.format("%02d:%02d:%02d:%d", hour, minute, second, millis);

2
यह सही नहीं लगता है। क्या TimeUnit.MILLISECONDS.toSeconds(), उदाहरण के लिए, सेकंड या शेष सेकंड में इसी अवधि के लिए परिवर्तित मिलीसेकेंड घंटे और मिनट घटाने के बाद? समाधान के लिए बाद की आवश्यकता होती है।
डेरेक महार

यह तरीका गलत है, यह 431220: 25873204: 1552392282: 0 अगर मैं 12 मार्च 2019 की तारीख को 13h4 42
0ddlyoko

6
public static String timeDifference(long timeDifference1) {
long timeDifference = timeDifference1/1000;
int h = (int) (timeDifference / (3600));
int m = (int) ((timeDifference - (h * 3600)) / 60);
int s = (int) (timeDifference - (h * 3600) - m * 60);

return String.format("%02d:%02d:%02d", h,m,s);

4

करते हुए

logEvent.timeStamp / (1000*60*60)

आपको घंटे देगा, मिनट नहीं। प्रयत्न:

logEvent.timeStamp / (1000*60)

और आप के रूप में एक ही जवाब के साथ खत्म हो जाएगा

TimeUnit.MILLISECONDS.toMinutes(logEvent.timeStamp)

लेकिन TimeUnit.MILLISECONDS.toMinutes (logEvent.timeStamp) भी मेरा कचरा देता है। 21489586 मिनट नहीं है!
क्रेटाइलस

1
यह 01/01/1970 से पारित मिनटों की संख्या है।
निको Huysamen 8

ठीक है, तो मुझे वह प्रारूप कैसे मिलेगा जो मुझे चाहिए? Ie 10: 50: 40: 450; मुझे नहीं पता कि 1970 के बाद से मिनटों की संख्या का उपयोग कैसे किया जाए।
क्रेटिलस

हे क्षमा, बस सोचा था कि आप जानना चाहते थे कि इसका अर्थ कैसे बनाया जाए। सीनियर द्वारा पोस्ट देखें, कि इसे कवर करना चाहिए।
निको Huysamen

3

इसे इस्तेमाल करे:

    String sMillis = "10997195233";
    double dMillis = 0;

    int days = 0;
    int hours = 0;
    int minutes = 0;
    int seconds = 0;
    int millis = 0;

    String sTime;

    try {
        dMillis = Double.parseDouble(sMillis);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }


    seconds = (int)(dMillis / 1000) % 60;
    millis = (int)(dMillis % 1000);

    if (seconds > 0) {
        minutes = (int)(dMillis / 1000 / 60) % 60;
        if (minutes > 0) {
            hours = (int)(dMillis / 1000 / 60 / 60) % 24;
            if (hours > 0) {
                days = (int)(dMillis / 1000 / 60 / 60 / 24);
                if (days > 0) {
                    sTime = days + " days " + hours + " hours " + minutes + " min " + seconds + " sec " + millis + " millisec";
                } else {
                    sTime = hours + " hours " + minutes + " min " + seconds + " sec " + millis + " millisec";
                }
            } else {
                sTime = minutes + " min " + seconds + " sec " + millis + " millisec";
            }
        } else {
            sTime = seconds + " sec " + millis + " millisec";
        }
    } else {
        sTime = dMillis + " millisec";
    }

    System.out.println("time: " + sTime);

0
    long hours = TimeUnit.MILLISECONDS.toHours(timeInMilliseconds);
    long minutes = TimeUnit.MILLISECONDS.toMinutes(timeInMilliseconds - TimeUnit.HOURS.toMillis(hours));
    long seconds = TimeUnit.MILLISECONDS
            .toSeconds(timeInMilliseconds - TimeUnit.HOURS.toMillis(hours) - TimeUnit.MINUTES.toMillis(minutes));
    long milliseconds = timeInMilliseconds - TimeUnit.HOURS.toMillis(hours)
            - TimeUnit.MINUTES.toMillis(minutes) - TimeUnit.SECONDS.toMillis(seconds);
    return String.format("%02d:%02d:%02d:%d", hours, minutes, seconds, milliseconds);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.