मेरे पास निम्नलिखित कोड है (मुद्दे पर ध्यान केंद्रित करने के लिए सरलीकृत)। यह SimpleDateFormat पैटर्न का उपयोग करके समय क्षेत्र की जानकारी प्रिंट करता है।

क्या आप जानते हैं कि अलग-अलग मशीनों पर z का अलग-अलग व्यवहार क्यों किया जाता है? और अगर जावा को सभी मशीनों में समान रूप से व्यवहार करने के लिए कहने का कोई तरीका है?

इस वर्ग का उपयोग JavaMail में किया जा रहा है और इससे हमारे ईमेल हेडर में समय शामिल हो रहा है जो कि नहीं है RFC 2822 का पालन करें।

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class DateFormatTest {
    String PATTERN = "z";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(this.PATTERN);

    public static void main(final String[] args) {
        new DateFormatTest().printTimezone();
    }

    public void printTimezone() {
        System.out.println(this.simpleDateFormat.format(Calendar.getInstance().getTime()));
    }

}

आउटपुट: विंडोज / मैक

PDT

आउटपुट: लिनक्स (सेंटोस लिनक्स रिलीज 7.5.1804 (कोर)) / उबंटू 14/18

GMT-07:00
8
Abhijeet Apsunde 25 सितंबर 2018, 01:24

1 उत्तर

सबसे बढ़िया उत्तर

टीएल; डॉ

कभी भी Calendar का प्रयोग न करें। इसके बजाय java.time कक्षाओं का उपयोग करें।

RFC 1123 / RFC 822 प्रारूप:

OffsetDateTime
.now( ZoneOffset.UTC )
.format( DateTimeFormatter.RFC_1123_DATE_TIME )

सोम, 24 सितंबर 2018 23:45:21 जीएमटी

किसी विशेष समय क्षेत्र में वर्तमान ऑफ़सेट-से-UTC प्राप्त करने के लिए:

ZoneId
.systemDefault()
.getRules()
.getOffset(
    Instant.now() 
)
.toString()

-07: 00

Calendar से बचें

आप भयानक पुराने दिनांक-समय वर्गों का उपयोग कर रहे हैं जिन्हें वर्षों पहले java.time द्वारा प्रतिस्थापित किया गया था। उन विरासत वर्गों का कभी भी उपयोग न करें; वे एक भयानक मनहूस गंदगी हैं।

Calendar व्यवहार के बारे में आपका विशेष मुद्दा विवादास्पद है क्योंकि उस वर्ग का फिर कभी उपयोग करने की कोई आवश्यकता नहीं है। यहां तक ​​​​कि जब पुराने कोड के साथ इंटरऑपरेट करना अभी तक java.time में अपडेट नहीं किया गया है, तो आप पुरानी कक्षाओं में जोड़े गए नए तरीकों के माध्यम से विरासत और आधुनिक कक्षाओं के बीच आसानी से परिवर्तित कर सकते हैं।

ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime() ;

…तथा…

GregorianCalendar gc = GregorianCalendar.from( zdt ) ; 

Java.time

जाहिरा तौर पर आप अपने वर्तमान डिफ़ॉल्ट समय क्षेत्र के लिए वर्तमान ऑफसेट-से-यूटीसी चाहते हैं।

वर्तमान डिफ़ॉल्ट समय क्षेत्र प्राप्त करें, एक ZoneId.

ZoneId z = ZoneId.systemDefault() ;  // Or specify ZoneId.of( "Pacific/Auckland" ) or so on.

उसमें नियम मांगें समय क्षेत्र।

ZoneRules rules = z.getRules() ;

उस क्षेत्र में एक निश्चित समय पर ऑफसेट-से-यूटीसी को प्रभावी बनाएं। हम वर्तमान क्षण का उपयोग करेंगे, एक Instant

Instant now = Instant.now() ;
ZoneOffset offset = rules.getOffset( now ) ;

उस ऑफ़सेट-से-यूटीसी का प्रतिनिधित्व करने वाला टेक्स्ट जेनरेट करें।

String output = "At " + now + " in zone " + z + " the offset is " + offset;

2018-09-24T23:38:44.192642Z ज़ोन अमेरिका/लॉस_एंजेल्स में ऑफ़सेट -07:00 है

आरएफसी 1123 / आरएफसी 822

आपने एक आरएफसी का उल्लेख किया लेकिन निर्दिष्ट नहीं किया। शायद आरएफसी 1123/822?

एक उसके लिए फ़ॉर्मैटर java.time में बनाया गया है।

OffsetDateTime nowInUtc = OffsetDateTime.now( ZoneOffset.UTC ) ;
String output = nowInUtc.format( DateTimeFormatter.RFC_1123_DATE_TIME ) ;

सोम, 24 सितंबर 2018 23:45:21 जीएमटी

आईएसओ ८६०१

FYI करें, कि RFC 1123 / RFC 822 प्रारूप एक भयानक प्रारूप है। यह अंग्रेजी मानता है। मशीनों के लिए विश्लेषण करना मुश्किल है, और मनुष्यों के लिए पढ़ना मुश्किल है। लेकिन मैं समझता हूं कि पुराने पुराने प्रोटोकॉल के लिए आपको इसकी आवश्यकता हो सकती है।

बस इतना जान लें कि आधुनिक प्रोटोकॉल ISO 8601 मानक प्रारूपों का उपयोग करते हैं। आसानी से, इन प्रारूपों का उपयोग डिफ़ॉल्ट रूप से java.time कक्षाओं में किया जाता है जब स्ट्रिंग्स को पार्स/जनरेट किया जाता है।


java.time . के बारे में

java.time फ्रेमवर्क जावा 8 और बाद के संस्करणों में बनाया गया है। ये कक्षाएं परेशान करने वाली पुरानी विरासत दिनांक-समय की कक्षाओं जैसे java.util.Date, Calendar, और SimpleDateFormat

जोडा-टाइम प्रोजेक्ट, अब रखरखाव मोड, java.time क्लासेस।

अधिक जानने के लिए, देखें Oracle Tutorial. और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता JSR 310 है।

आप सीधे अपने डेटाबेस से java.time वस्तुओं का आदान-प्रदान कर सकते हैं। JDBC ड्राइवर का उपयोग करें जो JDBC 4.2 या बाद का संस्करण। स्ट्रिंग्स की कोई आवश्यकता नहीं है, java.sql.* कक्षाओं की कोई आवश्यकता नहीं है।

Java.time कक्षाएं कहाँ से प्राप्त करें?

ThreeTen-Extra प्रोजेक्ट java.time को अतिरिक्त कक्षाओं के साथ बढ़ाता है . यह परियोजना java.time में संभावित भावी परिवर्धन के लिए एक सिद्ध आधार है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval, YearWeek, YearQuarter, और अधिक

10
Basil Bourque 25 सितंबर 2018, 21:19