2012-08-17 30 views
10

मैं एंड्रॉइड ऐप के लिए कोड के इस टुकड़े के साथ थोड़ी देर के लिए संघर्ष कर रहा हूं और मुझे इसका लटका नहीं मिल सकता है। मैंने स्टैक ओवरफ्लो और अन्य स्थानों पर मिले हर समाधान को पढ़ और कोशिश की है, लेकिन अभी भी कोई भाग्य नहीं है।नैनोसेकंड के साथ स्ट्रिंग-डेट रूपांतरण

मैं जो करना चाहता हूं उसके पास "17.08.2012 05:35:19:7600000" जैसे यूटीसी दिनांक और एक फ़ंक्शन जो UTC date लेता है और उसे इस तरह की स्ट्रिंग में परिवर्तित करता है।

String value = "17.08.2012 05:35:19:7600000"; 
DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS"); 
try 
{ 
    Date today = df.parse(value); 
    System.out.println("Today = " + df.format(today) + " " + today.toGMTString()); 
} 
catch (ParseException e) 
{ 
    e.printStackTrace(); 
} 

परिणामस्वरूप: Today = 17.08.2012 07:41:59:0000000 17 Aug 2012 04:41:59 GMT जो दोनों गलत हैं।

मैंने SDF's timezone को UTC पर सेट करने की कोशिश की, कोई भाग्य नहीं।
एक और चीज जो मैंने देखा: यदि मैं df.setLenient(false);
यह मुझे देता है: java.text.ParseException: Unparseable date: "17.08.2012 05:35:19:7600000"

यदि कोई मुझे कुछ स्पष्टीकरण/नमूना कोड प्रदान कर सकता है, तो मैं बहुत आभारी रहूंगा। अग्रिम धन्यवाद

उत्तर

16

परिणाम जो आपको मिल रहा है वह बिल्कुल सही है।

के इस विश्लेषण करते हैं:

17.08.2012 05:35:19:7600000 
  • 17: माह का दिन (17)
  • 08: साल के महीने (अगस्त)
  • 2012: वर्ष (2012)
  • 05: दिन का समय (5 बजे)
  • 35: घंटे का मिनट (: 35)
  • 1 9: दूसरा मिनट (: 1 9)
  • 7,600,000: की दूसरी (7.600.000)

मिलीसेकंड अब, जिस तरह से वीएम यह देखता है कि आप 5:35:19 बजे दिन के समय की घोषणा कर रहे हैं, तो यह करने के लिए 7,600,000 मिलीसेकंड जोड़ने है। 7,600,000 मिलीसेकंड = 7,600 सेकंड = 2 घंटे, 6 मिनट, 40 सेकंड। 5:35:19 पूर्वाह्न + 02:06:40 = 7:41:59 पूर्वाह्न (और 0 मिलीसेकंड)। यह परिणाम आप प्राप्त कर रहे हैं। (यह भी प्रतीत होता है कि आप टाइमज़ोन को ठीक से सेट नहीं कर रहे हैं, इसलिए जीएमटी स्ट्रिंग आपके परिणाम के 3 घंटे बाद है।)

यदि आप :7600000 को अपने ज्ञान में रखना चाहते हैं, तो यह संभव नहीं है। चूंकि इसे सेकंड में सरलीकृत किया जा सकता है, इसलिए वीएम स्वचालित रूप से इसे दूसरी बार वृद्धि में कम कर देगा। मिलीसेकंड (SSSS) मान < 1000 को संग्रहीत करने के लिए होना चाहिए।

मैं सुझाव देता हूं कि आप अपने आउटपुट के लिए एक नया SimpleDateFormat बनाएं; लेकिन याद रखें कि मिलीसेकंड अन्य समय में अवशोषित हो जाएंगे (क्योंकि वे सभी ऑब्जेक्ट में एक long के रूप में संग्रहीत हैं)।

+0

धन्यवाद! SetTimeZone (TimeZone.getTimeZone ("UTC") के बाद) सब ठीक हो गया। मिलीसेकंड के बारे में, मुझे लगता है कि मैं उन्हें 0 पर रीसेट कर दूंगा। ऐसा मत सोचो कि यह मेरे मामले में मायने रखता है। मैंने जो उदाहरण दिया वह एक सर्वर से प्रतिक्रिया थी, अब यूटीसी के रूप में, मुझे देखना होगा कि यह उन मिलीसेकंड क्यों लौटाता है। – Rhadoozooz

+0

खुशी है कि आपने इस मुद्दे को समझ लिया है! सौभाग्य! :) – Eric

+2

@Eric बीटीडब्ल्यू अच्छी व्याख्या, सराहनीय। –

6
private String convertDate(String cdate) 
{ 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS"); 
    SimpleDateFormat postFormater = new SimpleDateFormat("yyyy-MM-dd"); 
    Date convertedDate; 
    try 
    { 
     convertedDate = dateFormat.parse(cdate); 
     cdate = postFormater.format(convertedDate); 
    } 
    catch (ParseException e) 
    { 
     Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_SHORT).show(); 
    } 
    return cdate; 
} 

इसे आजमाएं।

+0

postFormater में अपने प्रारूप टाइप –

2

यह तुम क्या जरूरत है (लेकिन यह मिलीसेकंड जानकारी से वंचित रह जाएंगे) है:

"dd.MM.yyyy HH:mm:ss.'000000'" 

यदि आप "dd.MM.yyyy HH:mm:ss.SSSSSS" इस्तेमाल किया है, तो अपने मिलीसेकंड के लिए तीन अग्रणी शून्य मिलेगा।

यदि आपने "dd.MM.yyyy HH:mm:ss.SSS'000'" का उपयोग किया है, तो आप किसी दिनांक को प्रारूपित कर सकते हैं, लेकिन किसी भी तिथि का विश्लेषण नहीं कर सकते।

इसे आजमाएं:

public static void main(String[] args) throws ParseException { 
    printDate("dd.MM.yyyy HH:mm:ss.SSS");//02.05.2010 21:45:58.073 
    printDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//02.05.2010 21:45:58.000073 
    printDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//02.05.2010 21:45:58.073000 
    printDate("dd.MM.yyyy HH:mm:ss.'000000'");//02.05.2010 21:45:58.000000 

    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS");//good 
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//good 
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//bad 
    tryToParseDate("dd.MM.yyyy HH:mm:ss.'000000'");//good 
} 

private static void printDate(String formatString) { 
    Date now = new Date(); 
    SimpleDateFormat format = new SimpleDateFormat(formatString); 
    String formattedDate = format.format(now); 

    // print that date 
    System.out.println(formattedDate); 
} 

private static void tryToParseDate(String formatString) { 
    Date now = new Date(); 
    SimpleDateFormat format = new SimpleDateFormat(formatString); 
    String formattedDate = format.format(now); 

    // try to parse it again 
    try { 
     format.parse(formattedDate); 
     System.out.println("good"); 
    } catch (ParseException e) { 
     System.out.println("bad"); 
    } 
}