2008-11-14 13 views
32

मैं एक पीएसटी ऑफसेट (उदाहरण के लिए, 2008-11-13T13: 23: 30-08: 00) के साथ एक टाइमस्टैम्प आउटपुट करना चाहता हूं। java.util.SimpleDateFormatघंटे में टाइमज़ोन ऑफ़सेट आउटपुट प्रतीत नहीं होता है: मिनट प्रारूप, इसमें कोलन शामिल नहीं है। जावा में उस टाइमस्टैम्प को पाने का कोई आसान तरीका है?आउटपुट आरएफसी 3339 जावा में टाइमस्टैम्प

// I want 2008-11-13T12:23:30-08:00 
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date()); 
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference? 

इसके अलावा, SimpleDateFormat ठीक से ऊपर के उदाहरण पार्स नहीं कर सकता। यह ParseException फेंकता है।

// Throws a ParseException 
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00") 

उत्तर

31

जावा 7 में शुरू होने पर, ISO1201 समय क्षेत्र के लिए X पैटर्न स्ट्रिंग है। आपके द्वारा वर्णित प्रारूप में तारों के लिए, XXX का उपयोग करें। See the documentation

नमूना:

System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX") 
     .format(new Date())); 

परिणाम:

2014-03-31T14:11:29+02:00 
+0

मुझे "2017-12-12T02: 01: 43.924-08: 00" पार्स करते समय पारसेएक्सप्शन मिल रहा है, जो मुझे Google क्लाउड एपीआई –

+0

@ पुजंजैन से मिला है जिसमें मिलीसेकंड है, जिसमें इस पैटर्न में शामिल नहीं है। –

2
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ"); 

वास्तव में क्या आप की जरूरत नहीं है?

+0

नहीं। यदि आप ऊपर दिए गए टाइमस्टैम्प को पार्स करने का प्रयास करते हैं, तो यह ParseException फेंक देगा। – Cristian

+0

यह "2008-11-13T13: 23: 30-0800" के लिए काम करता है। – FoxyBOA

+3

जो ऊपर दिए गए दिनांक के समान दिनांक प्रारूप नहीं है। –

13

Joda Time पैकेज देखें। वे आरएफसी 3339 तारीख स्वरूपण को बहुत आसान बनाते हैं।

Joda उदाहरण:

DateTime dt = new DateTime(2011,1,2,12,45,0,0, DateTimeZone.UTC); 
DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); 
String outRfc = fmt.print(dt); 
+2

यह उत्तर वास्तव में एक उदाहरण के साथ उपयोगी होगा। – noah

+1

@ बिफ आप अपने कोड उदाहरण को सरल बना सकते हैं। फॉर्मेटर के लिए कोई ज़रूरत नहीं है। जोडा-टाइम स्वचालित रूप से [आईएसओ 8601] (https://en.wikipedia.org/wiki/ISO_8601)/[आरएफसी 3339] (http://www.ietf.org/rfc/rfc3339.txt) प्रारूप में डिफ़ॉल्ट रूप से चूक जाता है। बस 'toString' विधि को कॉल करें, या तो स्पष्ट रूप से या निहित रूप से। इस तरह, 'स्ट्रिंग आउटपुट = dt.toString(); ' –

4

समस्या यह है कि जेड समय क्षेत्र में एक विराम के बिना भरपाई का उत्पादन होता है (:) विभाजक के रूप में।

+0

बिल्कुल सही है, लेकिन हमें यह नहीं बताता कि इसे कैसे ठीक किया जाए। Jjohn से समाधान मेरे लिए तय किया। – scaganoff

11

"इसे पूरा करने के लिए," एक समाधान है SimpleDateFormat पूरा होने के बाद स्ट्रिंग को ठीक करने के लिए regexes का उपयोग करना है। एस/(\ डी {2}) (\ d {2}) $/$ 1: $ 2/पर्ल में कुछ।

यदि आप इसमें भी रूचि रखते हैं, तो मैं इस प्रतिक्रिया को जावा कोड के साथ संपादित कर दूंगा।

लेकिन, हाँ। मैं भी इस समस्या को मार रहा हूँ। आरएफसी 3339, मैं आपको देख रहा हूँ!

संपादित करें:

यह मैं

// As a private class member 
private SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 

String toRFC3339(Date d) 
{ 
    return rfc3339.format(d).replaceAll("(\\d\\d)(\\d\\d)$", "$1:$2"); 
} 
1

लिए काम करता है मैं एक आवारा pastebin में पाया गया कि मुझे इस मुद्दे के साथ बाहर की मदद की: http://pastebin.com/y3TCAikc

शायद ज़रुरत पड़े इसकी सामग्री बाद में हटा दिया जाता है:

// I want 2008-11-13T12:23:30-08:00 
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date()); 
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference? 

// Throws a ParseException 
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00") 

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ"); 
0

मैंने आरएफसी 33 के लिए InternetDateFormat कक्षा बनाई 39।

लेकिन स्रोत कोड टिप्पणी जापानी है।

पीएस: मैंने अंग्रेजी संस्करण बनाया और थोड़ा सा रिफैक्टरिंग किया।

9

मैं काफी काफी समय बिताया एक ही मुद्दे के जवाब की तलाश में और मैं यहाँ कुछ पाया: http://developer.android.com/reference/java/text/SimpleDateFormat.html

सुझाए गए जवाब :

String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZZZZZ").format(new Date());

यदि आप देखते हैं कि मैं एक के बजाय 5 'ज़ेड' का उपयोग कर रहा हूं। यह इस तरह ऑफसेट में एक कोलन के साथ आउटपुट देता है: "2008-11-13T12: 23: 30-08: 00"। आशा करता हूँ की ये काम करेगा।

+0

धन्यवाद - आपका उत्तर कम हो गया है - आखिर में मुझे आरएफसी 3339 आउटपुट करने की इजाजत मिली। एक्स का उपयोग करके मुझे 'कारण दिया गया: java.lang.IllegalArgumentException: अवैध पैटर्न घटक: XXX \t org.apache.commons.lang.time पर .FastDateFormat.parsePattern (FastDateFormat.java:691) \t org.apache.commons.lang.time.FastDateFormat.init (FastDateFormat.javaox58) ' – Zasz

+0

मदद करने में खुशी :) –