java - समय अंतर पाने के लिए 2 कैलेंडर वर्ग के उदाहरणों का उपयोग करना




calendar timezone (3)

मैं अपने अनुप्रयोग में एक समस्या का प्रयास करने और समझने के लिए जावा में कैलेंडर लाइब्रेरी का उपयोग कर रहा हूं:

मेरे पास दो कैलेंडर उदाहरण हैं, depart और arrive

depart शनिवार शाम 5:35 बजे , शिकागो से 7/15/2015 पर जा रहा है, जबकि बर्लिन, जर्मनी में 7/16/15 बजे 9:50 बजे उतरा है।

यात्रा अवधि प्रदर्शित करने के लिए मेरा वर्तमान कोड है:

    Calendar depart = Calendar.getInstance();       
    Calendar arrive = Calendar.getInstance();

    depart.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
    arrive.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));

    depart.set(Calendar.MONTH, 6);
    depart.set(Calendar.DAY_OF_MONTH, 15);
    depart.set(Calendar.HOUR_OF_DAY, 17);
    depart.set(Calendar.MINUTE, 35);

    arrive.set(Calendar.MONTH, 6);
    arrive.set(Calendar.DAY_OF_MONTH, 16);
    arrive.set(Calendar.HOUR_OF_DAY, 9);
    arrive.set(Calendar.MINUTE, 50);

System.out.println("Depart: " + depart.getTime() + "\nArrive: " + arrive.getTime());

long hours = (arrive.getTimeInMillis() - depart.getTimeInMillis()) / (1000*60*60);
long minutes = (arrive.getTimeInMillis() - depart.getTimeInMillis()) / (1000*60) - (hours*60);

System.out.println("Flight duration: " + hours + " hours" + " " + minutes + " minutes");`

और परिणाम है:

Depart: Wed Jul 15 17:35:53 CDT 2015 Arrive: Thu Jul 16 02:50:53 CDT 2015 Flight duration: 9 hours 15 minutes

... लेकिन मुझे परिणाम होने की आवश्यकता है:

Depart: Wed Jul 15 17:35:53 CDT 2015 Arrive: Thu Jul 16 **09:50:53 Central European Timezone** 2015 Flight duration: 9 hours 15 minutes

मुझे दोनों को विदा करने और पहुंचने की जरूरत है ताकि वे अपना स्थानीय समय प्रदर्शित कर सकें, लेकिन फिर भी 9 घंटे और 15 मिनट की सही यात्रा अवधि की रिपोर्ट करें।


Answers

आप DateFormat s का प्रयोग कर सकते हैं ताकि आप अपनी तिथियां अपनी इच्छानुसार पेश कर सकें:

DateFormat departDF = DateFormat.getDateTimeInstance(
    DateFormat.LONG, DateFormat.LONG, Locale.US
);
departDF.setTimeZone(depart.getTimeZone());
System.out.println(departDF.format(depart.getTime()));
DateFormat arriveDF = DateFormat.getDateTimeInstance(
    //                                change to US if you want them homologated
    //                                it won't change the time zone info or date/time
    DateFormat.LONG, DateFormat.LONG, Locale.GERMANY
);
arriveDF.setTimeZone(arrive.getTimeZone());
System.out.println(arriveDF.format(arrive.getTime()));

उत्पादन

July 15, 2015 5:35:43 PM CDT
16. Juli 2015 09:50:43 CEST

आप एक Date इंस्टैंस प्राप्त करने के लिए getTime() को बुला रहे हैं, और फिर getTime() को उस पर कॉल करने पर, निहित - जो हमेशा सिस्टम स्थानीय समय क्षेत्र का उपयोग करेगा

आप SimpleDateFormat का उपयोग करना चाहते हैं ताकि आप स्वरूपण के लिए उपयोग किए गए टाइम ज़ोन को नियंत्रित कर सकें। उदाहरण के लिए:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm z", Locale.US);
formatter.setTimeZone(depart.getTimeZone());
System.out.println("Depart: " + formatter.format(depart.getTime()));
formatter.setTimeZone(arrive.getTimeZone());
System.out.println("Arrive: " + formatter.format(arrive.getTime()));

सिर्फ दो उदाहरण हैं जहां मैं एक निजी विधि का परीक्षण करना चाहता हूं:

  1. डिक्रिप्शन दिनचर्या - मैं उन्हें परीक्षण के लिए देखने के लिए किसी को भी दिखाना नहीं चाहता, अन्य कोई भी उन्हें डिक्रिप्ट करने के लिए उपयोग कर सकता है। लेकिन वे कोड, जटिल, और हमेशा काम करने की आवश्यकता के लिए आंतरिक हैं (स्पष्ट अपवाद प्रतिबिंब है जिसका उपयोग ज्यादातर मामलों में निजी तरीकों को देखने के लिए भी किया जा सकता है, जब SecurityManager प्रबंधक इसे रोकने के लिए कॉन्फ़िगर नहीं किया गया है)।
  2. सामुदायिक खपत के लिए एक एसडीके बनाना । यहां सार्वजनिक पूरी तरह से अलग अर्थ लेता है, क्योंकि यह कोड है कि पूरी दुनिया देख सकती है (न केवल मेरे आवेदन के लिए आंतरिक)। अगर मैं एसडीके उपयोगकर्ताओं को यह नहीं देखना चाहता हूं तो मैं निजी तरीकों से कोड डालता हूं - मुझे इसे कोड गंध के रूप में नहीं देखा जाता है, जैसे कि एसडीके प्रोग्रामिंग कैसे काम करता है। लेकिन निश्चित रूप से मुझे अभी भी अपने निजी तरीकों का परीक्षण करने की आवश्यकता है, और वे हैं जहां मेरे एसडीके की कार्यक्षमता वास्तव में रहती है।

मैं केवल "अनुबंध" का परीक्षण करने के विचार को समझता हूं। लेकिन मुझे नहीं लगता कि कोई वास्तव में कोड का परीक्षण नहीं कर सकता है - आपका माइलेज भिन्न हो सकता है।

तो मेरे व्यापार में मेरी सुरक्षा और एसडीके समझौता करने के बजाय, ज्यूनिट्स को प्रतिबिंब के साथ जटिल बनाना शामिल है।





java calendar timezone