2012-01-11 22 views
15

मेरे पास एक स्ट्रिंग 00:01:30.500 है जो 90500 मिलीसेकंड के बराबर है। मैंने SimpleDateFormat का उपयोग करने का प्रयास किया जो वर्तमान तिथि सहित मिलीसेकंड प्रदान करता है। मुझे बस उस स्ट्रिंग प्रस्तुति को मिलीसेकंड की आवश्यकता है। क्या मुझे कस्टम विधि लिखनी है, जो मिलीसेकंड को विभाजित और गणना करेगा? या ऐसा करने का कोई और तरीका है? धन्यवाद।एचएच कैसे परिवर्तित करें: mm: ss.SSS से मिलीसेकंड?

मैं के रूप में की कोशिश की है इस प्रकार है:

 String startAfter = "00:01:30.555"; 
     SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); 
     Date date = dateFormat.parse(startAfter); 
     System.out.println(date.getTime()); 
+0

SimpleDateFormat बनाने के लिए आप किस पैटर्न का उपयोग करते थे? क्या आप कोड पोस्ट कर सकते हैं? –

उत्तर

31

आप SimpleDateFormat उपयोग कर सकते हैं यह करने के लिए। आपको सिर्फ 2 चीजें जाननी हैं।

  1. सभी तिथियों आंतरिक यूटीसी में प्रतिनिधित्व कर रहे हैं
  2. .getTime() के बाद से 1970-01-01 00:00:00 यूटीसी मिलीसेकेंड की संख्या देता है।
package se.wederbrand.milliseconds; 

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

public class Main {   
    public static void main(String[] args) throws Exception { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
     sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 

     String inputString = "00:01:30.500"; 

     Date date = sdf.parse("1970-01-01 " + inputString); 
     System.out.println("in milliseconds: " + date.getTime());   
    } 
} 
+1

yyyy-MM-dd और 1970-01-01 को पूर्ववत करने की आवश्यकता नहीं है। ओपी के रूप में पार्सिंग काम करता है अगर टाइमज़ोन जीएमटी पर सेट है। –

+0

@JBNizet सच और एक अच्छा बिंदु। मैंने जानबूझकर अतिरिक्त तिथि की जानकारी शामिल की क्योंकि मुझे लगता है कि यह बेहतर दिखाता है कि वास्तव में क्या चल रहा है। –

+0

@AndreasWederbrand: "चाल" जो इसे यहां काम करती है वह दिन 1 जनवरी 1 9 70 को निर्धारित करना है। लेकिन मान लीजिए कि अगर मैं इस दिन नहीं देता, तो क्या यह काम करेगा? –

2

आप SimpleDateFormat का उपयोग करना चाहते हैं, तो आप लिख सकते हैं:

private final SimpleDateFormat sdf = 
    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    { sdf.setTimeZone(TimeZone.getTimeZone("GMT")); } 

private long parseTimeToMillis(final String time) throws ParseException 
    { return sdf.parse("1970-01-01 " + time).getTime(); } 

लेकिन एक कस्टम विधि और अधिक कुशल हो जाएगा। SimpleDateFormat, इसके सभी कैलेंडर समर्थन, समय-क्षेत्र समर्थन, डेलाइट-बचत-समय समर्थन, और इसी तरह, बहुत धीमी है। यदि आपको वास्तव में उन सुविधाओं में से कुछ की आवश्यकता है, तो धीमापन इसके लायक है, लेकिन जब से आप नहीं करते हैं, तो यह नहीं हो सकता है। (यह इस बात पर निर्भर करता है कि आप इस विधि को कितनी बार कॉल कर रहे हैं, और क्या दक्षता आपके आवेदन के लिए चिंता का विषय है।)

इसके अलावा, SimpleDateFormat गैर थ्रेड-सुरक्षित है, जो कभी-कभी दर्द होता है। (आपके आवेदन के बारे में कुछ भी जानने के बिना, मुझे लगता है कि यह महत्वपूर्ण नहीं है।)

व्यक्तिगत रूप से, मैं शायद एक कस्टम विधि लिखूंगा।

+0

yyyy-MM-dd और 1970-01-01 को पूर्ववत करने की आवश्यकता नहीं है। ओपी के रूप में पार्सिंग काम करता है अगर टाइमज़ोन जीएमटी पर सेट है। –

+0

@JBNizet: मेरे सिस्टम पर यह सच है, लेकिन ओपी ने लिखा है कि उसके दृष्टिकोण ने "वर्तमान तिथि सहित मिलीसेकंड" दिया है, इसलिए मैं मान रहा था कि उसके जेडीके के 'SimpleDateFormat' के कार्यान्वयन को 'calendar.clear () '। मुझे जावाडोक में कुछ भी दिखाई नहीं देता है जो इंगित करता है कि 'SimpleDateFormat' को 1 9 70-01-01 तक डिफ़ॉल्ट होना चाहिए। क्या आपको पता है कि इसकी गारंटी है? – ruakh

1

JODA का उपयोग करना:

PeriodFormatter periodFormat = new PeriodFormatterBuilder() 
    .minimumParsedDigits(2) 
    .appendHour() // 2 digits minimum 
    .appendSeparator(":") 
    .minimumParsedDigits(2) 
    .appendMinute() // 2 digits minimum 
    .appendSeparator(":") 
    .minimumParsedDigits(2) 
    .appendSecond() 
    .appendSeparator(".") 
    .appendMillis3Digit() 
    .toFormatter(); 
Period result = Period.parse(string, periodFormat); 
return result.toStandardDuration().getMillis(); 
3

आप प्रारूप पार्स करने के लिए अपने आप को आप इसे आसानी से कर सकता है एक regex जैसे

private static Pattern pattern = Pattern.compile("(\\d{2}):(\\d{2}):(\\d{2}).(\\d{3})"); 

public static long dateParseRegExp(String period) { 
    Matcher matcher = pattern.matcher(period); 
    if (matcher.matches()) { 
     return Long.parseLong(matcher.group(1)) * 3600000L 
      + Long.parseLong(matcher.group(2)) * 60000 
      + Long.parseLong(matcher.group(3)) * 1000 
      + Long.parseLong(matcher.group(4)); 
    } else { 
     throw new IllegalArgumentException("Invalid format " + period); 
    } 
} 

हालांकि साथ चाहते हैं, इस पार्स काफी उदार है और 99 को स्वीकार करेंगे : 99: 99.9 99 और मूल्यों को ओवरफ्लो दें। यह एक कमी या एक विशेषता हो सकती है।

+0

अरे मैंने आपके दृष्टिकोण का उपयोग किया है, लेकिन इसके परिणामस्वरूप एक अतिरिक्त चरित्र के साथ परिणाम मिलता है, यह एल के कारण है, आपने 3600000 – Prateek

+0

के साथ उपयोग किया है, शायद नहीं, एल इसे लंबे समय तक बनाना है। कौन सा हिस्सा परिणाम देता है -? DateParseRegExp एक लंबा लौटाता है जिसमें कोई नहीं है - (जब तक यह नकारात्मक न हो)। क्या यह मिलान करने वाले समूहों में से एक है -? –

+0

ओओपीएस मेरे खराब होने की वजह से नहीं। – Prateek

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