2016-03-30 7 views
8

मैं अपना खुद का डेटटाइमफॉर्मेटर ग्लोबल फॉर्मेटर के रूप में सेट करना चाहता हूं। जब मैं निम्न पंक्ति कार्य करें:जावा 8 ग्लोबल टाइम फॉर्मेटर्स सेट करना

ZonedDateTime.now(); 

मैं:

2016-03-30T08:58:54.180-06:00[America/Chicago] 

मैं ऐसा करते हैं तो:

ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME) 

मैं:

Wed, 30 Mar 2016 9:00:06 -0600 

मैं चाहता हूँ क्या मुद्रित है ऊपर लेकिन मैं/अपराह्न के साथ इसलिए मैंने अपना कस्टम फॉर्मेटर बनाया और मुद्रित किया इसलिए जैसे समय:

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss a Z"); 

ZonedDateTime.now().format(FORMATTER); 

कौन मुझे दिया:

Wed, 30 Mar 2016 9:00:06 AM -0600 

लेकिन मैं प्रवेश के प्रयोजनों के लिए हर जगह इस .now() विधि का उपयोग करें और मैं कोड में हर जगह फ़ॉर्मेटर परिभाषित करना चाहते हैं न। .now() विधि को कॉल करते समय फ़ॉर्मेटर को डिफ़ॉल्ट प्रारूप के रूप में कॉन्फ़िगर करने का कोई तरीका है? मैं वसंत सेम विन्यास विधि या कुछ और की तरह सोच रहा हूँ .....

+2

फ़ॉरमेटर स्थिर सिंगलटन क्यों न बनाएं और इसे हर जगह एक्सेस करें? – Loc

+0

मुझे यकीन नहीं है कि मैं समझता हूं। 'ZonedDateTime.now() 'किसी भी फॉर्मेटर पर निर्भर नहीं है। और यदि आप 'प्रारूप' को कॉल करने के बाद प्रारूपित करना चाहते हैं, तो क्यों न केवल इसे स्थिर रखें? – Tunaki

+0

आपको क्या मिल रहा है toString परिणाम: क्या आप println का उपयोग कर रहे हैं? लकड़हारा? एक धारावाहिक? यदि आप ToString मामले में हैं, तो करने के लिए बहुत कुछ नहीं है। – pdem

उत्तर

5

आप बस एक कक्षा में एक निरंतर घोषित कर सकता है:

class UtilsOrWhatever { 
    public static final DateTimeFormater RFC_1123_DATE_TIME_AM_PM = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy hh:mm:ss a Z"); 
} 

और बस अपने कोड में उपयोग:

ZonedDateTime.now().format(RFC_1123_DATE_TIME_AM_PM); //needs a static import 

वैकल्पिक रूप से, शुद्ध जावा ईई 7 के साथ, आप a DateTimeFormatter Producer@Produces के साथ बना सकते हैं और फिर बस @Inject बना सकते हैं।

import javax.enterprise.context.ApplicationScoped; 
import javax.enterprise.inject.Produces; 

@ApplicationScoped 
public class RfcFormatterProducer { 
    @Produces 
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy hh:mm:ss a Z"); 
} 

अपने कोड में:

@Inject DateTimeFormatter rfc; 

आप भी इसे एक नाम की तरह ऊपर अगर आपके पास कई formatters है कड़ी में दे सकता है।

+0

लेकिन मुझे उन सभी कक्षाओं में इंजेक्ट करना होगा जहां मैं डेटाटाइम सही प्रिंट करना चाहता हूं? याँ नहीं? – Richard

+1

हाँ आप करेंगे - 'प्रारूप' विधि के व्यवहार को "ओवरराइड" करने का कोई तरीका नहीं है। निरंतर कहीं भी 'सार्वजनिक स्थैतिक अंतिम दिनांक समय Formater RFC_1123_DATE_TIME_AM_PM = ... परिभाषित करना एक विकल्प भी है। – assylias

+0

इसे कहीं परिभाषित करना और इसे स्थैतिक बनाना एक शानदार विचार है। यह कोड को कुछ हद तक साफ रखता है। यह सबसे आदर्श समाधान नहीं है लेकिन आदर्श समाधान सचमुच असंभव है इसलिए यह अगली सबसे अच्छी बात है। धन्यवाद! – Richard

0

मुझे सबसे पहले बताएं कि जब आप प्रारूप को कॉल नहीं करते हैं तो आपको क्या मिल रहा है। toString को ZonedDateTime पर कॉल किया जा रहा है, जो बदले में डेटटाइम और ऑफसेट पर टूस्ट्रिंग को कॉल करता है, जो स्थानीयडेट और लोकलटाइम पर स्ट्रिंग को कॉल करता है। ये toStrings फॉर्मेटर्स का उपयोग नहीं करते हैं, इसलिए यदि आप "डिफ़ॉल्ट" फ़ॉर्मेटर निर्दिष्ट कर सकते हैं, तो इसे ज़ोनडेटडेट टाइम को एक स्ट्रिंग में पूर्ण रूप से परिवर्तित करते समय नहीं कहा जाएगा।

स्वरूपित स्ट्रिंग को आसान बनाने के कई तरीके हैं। एक तरीका एक यूटिलिटी क्लास होगा जिसे आप अपने सभी लॉग स्टेटमेंट्स में बदल देंगे। मैं जरूरी निम्नलिखित सुझाव है कि नहीं है, लेकिन यह सबसे निकट फिट बैठता है कि तुम क्या कह रहे हैं:

public class MyAwesomeUtility { 
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss a Z"); 

    public static String getFormattedZonedDateTime() { 
     return ZonedDateTime.now().format(FORMATTER); 
    } 
} 

निम्नलिखित एक विकल्प के रूप @assylias से कहा के रूप में ZonedDateTime अंतिम नहीं है। इसे किसी भी मामले में छोड़कर।

यदि आप वास्तव में क्या आप सवाल है, जो now विधि के ऊपर लिख एक वस्तु है कि एक निर्धारित प्रारूप जब toString आप निम्नलिखित की तरह कुछ करने के लिए होता है कहा जाता था देना होगा वापस जाने के लिए पूछा क्या करने के लिए (नोट चाहता था : यह एक ANTIPATTERN है वास्तव में यह न करें):।

public class DefaultFormattedZonedDateTime extends ZonedDateTime { 
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss a Z"); 
    @Overwrite 
    public String toString() { 
     this.format(FORMATTER); 
    } 
} 

तब से now ZonedDateTime पर स्थिर है और अभी भी ZonedDateTime रिटर्न आप AspectJ का उपयोग करना होगा (आप नहीं AOP चारों ओर वसंत के साथ एक स्थिर विधि कर सकते हैं अकेले) अब इसके बजाय इस नई वस्तु को वापस करने के लिए।

+5

ज़ोनडडेट टाइम अंतिम है ... – assylias

+0

अच्छी पकड़। मैंने यह भी ध्यान नहीं दिया। मैंने यह बताने के लिए जवाब अपडेट किया कि यह वास्तव में एक विकल्प नहीं है। –

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