java - जावा में विभिन्न कैलेंडर समयक्षेत्र के साथ कार्य करना(जोडा टाइम का उपयोग किए बिना)




calendar timezone (3)

मैं एक उपयोगकर्ता इनपुट के आधार पर विभिन्न समयक्षेत्रों में वर्तमान समय प्राप्त करने का एक तरीका तलाश रहा था। मुझे पता है कि मैं जौदा समय का उपयोग कर सकता हूं! लेकिन क्या यह एकमात्र तरीका है?

क्या ऐसा करने के लिए जावा में कोई विकल्प नहीं है? मैंने निम्नलिखित कोड की कोशिश की जो सभी 3 sysouts के लिए समान आउटपुट देता है।

Calendar pst = Calendar.getInstance(TimeZone.getTimeZone("PST"));
System.out.println("PST " + pst.getTime());
Calendar ist = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta"));
System.out.println("IST " + ist.getTime());
Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("Etc/UTC"));
System.out.println("UCT " + utc.getTime());

मैं अन्य समयक्षेत्रों में वर्तमान समय के लिए यहां क्या लापता हूं?


Answers

हां, यह प्रत्येक मामले (या मिलिसेकंड्स अलग) में समान मूल्य दिखाएगा क्योंकि तीन कैलेंडर सभी समय में एक ही तत्काल (निष्पादन समय के बावजूद) का उल्लेख करते हैं और यही वह सब है जो एक java.util.Date प्रतिनिधित्व करता है। यह Calendar.getTime() . Calendar.getTime() का परिणाम है

हालांकि, Calendar स्वयं ही टाइम ज़ोन के बारे में जानता है, और जब आप Calendar.get इत्यादि का उपयोग करते हैं तो यह तब परिलक्षित होगा। जब आप एक SimpleDateFormat उपयोग करते हैं, तब भी इसका उपयोग किया जाएगा, जहां आप एक विशिष्ट समय क्षेत्र निर्दिष्ट कर सकते हैं।

// Specify whatever format you want - bear in mind different locales etc
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format.setTimeZone(calendar.getTimeZone());
String text = format.format(calendar.getTime());

यह बिल्कुल स्पष्ट नहीं है कि आप क्या करने की कोशिश कर रहे हैं, लेकिन मूल रूप से आपको जागरूक होना चाहिए कि किस प्रकार के समय क्षेत्र को पता है, और जो नहीं हैं। यह समझने में वास्तव में महत्वपूर्ण है कि java.util.Date में प्रारूप, एक कैलेंडर प्रणाली या समय क्षेत्र नहीं है: यूनिक्स युग के बाद से यह सिर्फ मिलीसेकेंड की संख्या है।


जैसा कि जॉन ने देखा है कि विधि getTime() एक java.util.Date ऑब्जेक्ट लौट रहा है जो सिर्फ एक getTime() और getTime() जागरूक नहीं है

यदि आप केवल समय छपाई करने के लिए देख रहे हैं तो आप कैलेंडर का उपयोग कर सकते हैं और मैन्युअल रूप से उन फ़ील्ड को प्राप्त कर सकते हैं जिन्हें आप चाहते हैं

System.out.println(utc.get(Calendar.HOUR_OF_DAY) + ":" + utc.get(Calendar.MINUTE))

इसे 0 के प्रदर्शित करने के लिए एक मिनट <10 के लिए कुछ स्वरूपण की आवश्यकता होगी


क्या आपने -Xcheck:jni डीबगिंग को -Xcheck:jni साथ चालू करने की कोशिश की है? दिलचस्प बात यह है कि ओरेकल दस्तावेज एक PlainSocketImpl.socketAccept त्रुटि का उपयोग इस उदाहरण के उदाहरण के रूप में करता है।

ध्यान दें कि बग 713139 9 का निहितार्थ यह है कि जेएनआई अधिकांश प्लेटफॉर्म पर poll() का उपयोग करता है लेकिन मैक पर poll() साथ किसी समस्या के कारण मैक ओएस पर select() करता है। तो शायद select() भी टूटा हुआ है। थोड़ी देर में खुदाई, चयन करें () EINVAL वापस कर देगा यदि "ndfs FD_SETSIZE से अधिक है और _DARWIN_UNLIMITED_SELECT परिभाषित नहीं है।" FD_SETSIZE 1024 है और ऐसा लगता है कि आपके पास एप्लिकेशन का एक टन लोड हो रहा है, इसलिए शायद यह सभी एक बार में 1024 एफडी की प्रतीक्षा करने के लिए नीचे फ़िल्टर हो जाता है।

अतिरिक्त क्रेडिट के लिए, देखें कि संबंधित (अनुमानित रूप से तय) जावा बग वास्तव में आपकी मशीन पर तय है या नहीं। बग रिपोर्ट में मामलों का परीक्षण करने के लिए पॉइंटर्स हैं।

ओल्ड प्रो के उत्तर के लिए धन्यवाद, मैंने पुष्टि की है कि select() FD_SETSIZE सीमा कारण है। मैं इस सीमा के लिए एक मौजूदा बग स्थित है:

https://bugs.openjdk.java.net/browse/JDK-8021820

समस्या को निम्नलिखित कोड के साथ पुन: उत्पन्न किया जा सकता है:

import java.io.*;
import java.net.*;

public class SelectTest {
  public static void main(String[] args) throws Exception {
    // Use 1024 file descriptors. There'll already be some in use, obviously, but this guarantees the problem will occur
    for(int i = 0; i < 1024; i++) {
      new FileInputStream("/dev/null");
    }
    ServerSocket socket = new ServerSocket(8080);
    socket.accept();
  }
}

लगभग एक साल बाद, जावा 7u60 में इस समस्या को ठीक किया गया है:

http://www.oracle.com/technetwork/java/javase/2col/7u60-bugfixes-2202029.html

मैंने यह भी पाया कि टॉमकैट के WebappClassLoader 90 सेकंड के बाद फ़ाइल हैंडल बंद कर देता है, जो बताता है कि सेटिंग ब्रेक पॉइंट्स ने समस्या को होने से क्यों रोका।





java calendar timezone