2009-09-18 14 views
5

एक तारीख है कि निम्न स्वरूपोंजावा तिथि प्रारूप जो अनुमति देता है -/या। तारीख

"dd-MM-yyyy HH:mm" 
"dd/MM/yyyy HH:mm" 
"dd.MM.yyyy HH:mm" 

में से एक में हो सकता है 3 SimpleDateFormats बनाकर प्रत्येक के खिलाफ पार्स करने के बिना पार्स करने के लिए सबसे अच्छा तरीका क्या है के भीतर विभाजक के रूप में।

धन्यवाद

उत्तर

4

यह शायद एक विहित प्रारूप में स्रोत स्ट्रिंग "मरोड़" के लिए सबसे आसान है:

if (text.length() == 16) 
{ 
    if ((text.charAt(2) == '/' && text.charAt(5) == '/') || 
     (text.charAt(2) == '.' && text.charAt(5) == '.')) 
    { 
     text = text.substring(0, 2) + "-" + text.substring(3, 5) 
      + "-" + text.substring(6); 
    } 
} 

तब का उपयोग कर प्रारूप स्ट्रिंग का उपयोग "-"।

ध्यान दें कि यह बहुत विशिष्ट है, केवल को अनचाहे दुष्प्रभावों से बचने के लिए, जिन पात्रों में आप रुचि रखते हैं उन्हें प्रतिस्थापित कर रहे हैं।

+0

धन्यवाद, मैं अपने कोड बेस के लिए जेनेरिक डेट पार्सर पर काम करना शुरू कर दूंगा और यह एक अच्छी शुरुआत होगी – Tarski

5

आप चलाने जा सका दो पहले आपरेशन की जगह है, ताकि आप एक ही एक के लिए सभी तीन स्वरूपों को कम?

+0

आह .. मैंने अपना उत्तर +1 पोस्ट करने से पहले इसे नहीं देखा था। महान! – vpram86

-3

ParseExact प्रारूपों की एक श्रृंखला ले सकता है। आपको अभी भी सभी प्रारूपों को निर्दिष्ट करना होगा, लेकिन यह एक ही ऑपरेशन है।

+2

यह एक जावा प्रश्न है, एक पैरासेएक्सएक्ट विधि – Tarski

+0

नहीं है जो SimpleDateFormat, या मानक की विधि नहीं है जावा विधि के लिए मामला। क्या आप सी # या इसी तरह का संदर्भ दे रहे हैं? –

+0

क्षमा करें, मेरी गलती। हाँ, वह सी # है। –

4

आप उपयोग कर सकते हैं Apache commons lang DateUtils.parseDate

import java.text.ParseException; 
import org.apache.commons.lang.time.DateUtils; 

public class Test { 

public static void main(String[] args) throws ParseException { 

    String[] values = new String[]{"31-12-2009 12:00", "31/12/2009 12:00", "31.12.2009 12:00"}; 
    String[] parsePatterns = new String[]{"dd-MM-yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd.MM.yyyy HH:mm"}; 

    for (String value : values) { 
     System.out.println(DateUtils.parseDate(value, parsePatterns)); 
    } 
} 
} 

ठीक है, आंतरिक रूप से यह SimpleDateFormats बनाता है, लेकिन उस के साथ क्या गलत?

1

कैसे एक regex के बारे में:

"\\d\\d[./-]\\d\\d[./-]\\d\\d\\d\\d \\d\\d:\\d\\d" 

कोड में यह कुछ इस तरह का मतलब होगा:

Pattern pattern = 
Pattern.compile("(\\d\\d)([./-])(\\d\\d)([./-])(\\d\\d\\d\\d) (\\d\\d):(\\d\\d)"); 

Matcher matcher = 
pattern.matcher("31-07-1983 15:30"); 

if (matcher.find() && matcher.group(2).equals(matcher.group(4))) { 
    int day = Integer.parseInt(matcher.group(1)); 
    int month = Integer.parseInt(matcher.group(3)); 
    int year = Integer.parseInt(matcher.group(5)); 
    int hour = Integer.parseInt(matcher.group(6)); 
    int minute = Integer.parseInt(matcher.group(7)); 
} 
+0

क्योंकि जावा स्ट्रिंग अक्षर में एक बचने वाला चरित्र है, तो आपको प्रत्येक को दोगुना करना होगा \ "" \\ d \\ d [\\। \\/\\ -] \\ d \\ d [\\। \ \/\\ -] \\ d \\ d \\ d \\ d \\ d \\ d: \\ d \\ d " – Jesper

+0

आप गलत हैं - आपको अभी भी" \\ d "लिखना होगा जावा स्रोत कोड, भले ही यह एक नियमित अभिव्यक्ति है या नहीं। – Jesper

+0

अब मुझे जाना और जांचना था, आप बिल्कुल सही हैं सर। वह नरक के रूप में बदसूरत है, वे इतनी आसानी से एक और बचने के चरित्र का उपयोग कर सकते हैं। – NomeN

0

यह अपने आप कर एक नियमित अभिव्यक्ति के साथ:

public class SpecialDateFormat 
{ 
    private final static Pattern PATTERN = Pattern.compile("(\\d{2})[\\.\\/\\-](\\d{2})[\\.\\/\\-](\\d{4}) (\\d{2}):(\\d{2})"); 

    public static Date parse(String text) throws ParseException { 
     Matcher m = PATTERN.matcher(text); 
     if (m.matches()) { 
      int dd = Integer.parseInt(m.group(1)); 
      int mm = Integer.parseInt(m.group(2)); 
      int yy = Integer.parseInt(m.group(3)); 
      int hh = Integer.parseInt(m.group(4)); 
      int mi = Integer.parseInt(m.group(5)); 

      // NOTE: Checking if values are in valid ranges omitted 

      Calendar cal = Calendar.getInstance(); 
      cal.set(yy, mm - 1, dd, hh, mi, 0); 

      return cal.getTime(); 
     } 
     else { 
      throw new ParseException("Unparseable date: " + text, 0); 
     } 
    } 
} 

नोट तथापि कि यह विभिन्न विभाजक मिश्रण, उदाहरण के लिए अनुमति देता है "17-09/200 9 12:00" की अनुमति होगी।

+0

मैं अवधारणा के स्पष्ट चोरी को कॉल करता हूं ;-), आप देखेंगे कि मैंने अलग-अलग विभाजक जांच में बहुत अधिक प्रयास किए बिना काम किया है। – NomeN

+0

और स्पष्ट रूप से आपको [], यहां तक ​​कि अवधि के बीच के किसी भी पात्र से बचने की आवश्यकता नहीं है। – NomeN

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