Windows मशीन (Java 11.0.9) में IntelliJ IDE के माध्यम से निष्पादित होने पर निम्न UnitTest विफल हो रहा है, लेकिन जावा के समान संस्करण के साथ Mac या Linux मशीन में निष्पादित होने पर पास हो जाता है।

@Test
public void rfc1123JaveTimeUtilParsing(){
    final String rfc1123Pattern = "EEE, dd MMM yyyy HH:mm:ss z";
    final String responseTimeStamp = "Mon, 14 Dec 2020 20:34:37 GMT";

    DateTimeFormatter javaTimeDateTimeFormatter = DateTimeFormatter.ofPattern(rfc1123Pattern);
    ZonedDateTime javaFinalTime = ZonedDateTime.parse(responseTimeStamp, javaTimeDateTimeFormatter);
    Assert.assertNotNull(javaFinalTime);
}

विंडोज़ के लिए परिणाम निम्न अपवाद है:

java.time.format.DateTimeParseException: टेक्स्ट 'सोम, 14 दिसंबर 2020 20:34:37 ​​GMT' इंडेक्स 0 पर पार्स नहीं किया जा सका

2
Ariel Vazquez 18 पद 2020, 22:58
4
लोकेल निर्दिष्ट करने का प्रयास करें: DateTimeFormatter.ofPattern(rfc1123Pattern, Locale.UK)
 – 
YCF_L
18 पद 2020, 23:01
3
@YCF_L की टिप्पणी में जोड़ना DateTimeFormatter.ofPattern(String) "डिफ़ॉल्ट FORMAT लोकेल" का उपयोग करता है। जो आपके ओएस में निर्दिष्ट एक पर आधारित है, इसलिए यदि आपकी विंडोज मशीन और आपके मैक या लिनक्स मशीन में एक अलग लोकेल है तो फॉर्मेटर अलग-अलग परिणाम देगा।
 – 
Marcono1234
18 पद 2020, 23:54
3
- परीक्षणों के लिए, अधिकांश मामलों में Locale.ROOT बेहतर विकल्प होगा, जब तक कि आप वास्तविक स्थानीय विशिष्ट सामग्री का परीक्षण नहीं करते। लेकिन Locale.UK इस मुद्दे के लिए एक अच्छा प्रारंभिक बिंदु होगा ...
 – 
tquadrat
19 पद 2020, 00:47
प्रतिक्रियाओं के लिए धन्यवाद दोस्तों। Locale.ENGLISH ने समस्या का समाधान किया।
 – 
Ariel Vazquez
21 पद 2020, 14:50

1 उत्तर

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

Locale के बिना कभी भी DateTimeFormatter का प्रयोग न करें।

चूंकि दिया गया दिनांक-समय अंग्रेजी में है, इसलिए आपको DateTimeFormatter के साथ Locale.ENGLISH का उपयोग करना चाहिए।

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        final String responseTimeStamp = "Mon, 14 Dec 2020 20:34:37 GMT";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(responseTimeStamp, dtf);
        System.out.println(zdt);
    }
}

आउटपुट:

2020-12-14T20:34:37Z[GMT]

डिफ़ॉल्ट रूप से, DateTimeFormatter#ofPattern डिफ़ॉल्ट FORMAT लोकेल जिसे JVM होस्ट वातावरण के आधार पर स्टार्टअप के दौरान सेट करता है। मैंने निम्नलिखित डेमो के माध्यम से समस्या का वर्णन करने की कोशिश की है:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        final String responseTimeStamp = "Mon, 14 Dec 2020 20:34:37 GMT";
        DateTimeFormatter dtfWithDefaultLocale = null;

        System.out.println("JVM's Locale: " + Locale.getDefault());
        // DateTimeFormatter with the default Locale
        dtfWithDefaultLocale = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z");
        System.out.println("DateTimeFormatter's Locale: " + dtfWithDefaultLocale.getLocale());
        System.out.println(
                "Parsed with JVM's default locale: " + ZonedDateTime.parse(responseTimeStamp, dtfWithDefaultLocale));

        // DateTimeFormatter with Locale.ENGLISH explicitly (recommended)
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(responseTimeStamp, dtf);
        System.out.println("Parsed with Locale.ENGLISH: " + zdt);

        // Setting the JVM's default locale to Locale.FRANCE
        Locale.setDefault(Locale.FRANCE);
        System.out.println("JVM's Locale: " + Locale.getDefault());
        // DateTimeFormatter with the default Locale
        dtfWithDefaultLocale = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z");
        System.out.println("DateTimeFormatter's Locale: " + dtfWithDefaultLocale.getLocale());
        System.out.println(
                "Parsed with JVM's default locale: " + ZonedDateTime.parse(responseTimeStamp, dtfWithDefaultLocale));
    }
}

आउटपुट:

JVM's Locale: en_GB
DateTimeFormatter's Locale: en_GB
Parsed with JVM's default locale: 2020-12-14T20:34:37Z[GMT]
Parsed with Locale.ENGLISH: 2020-12-14T20:34:37Z[GMT]
JVM's Locale: fr_FR
DateTimeFormatter's Locale: fr_FR
Exception in thread "main" java.time.format.DateTimeParseException: Text 'Mon, 14 Dec 2020 20:34:37 GMT' could not be parsed at index 0
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
    at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:598)
    at Main.main(Main.java:29)
0
Arvind Kumar Avinash 21 पद 2020, 03:25
बहुत विस्तृत स्पष्टीकरण और उदाहरणों के लिए बहुत बहुत धन्यवाद। मैंने अपने परीक्षण में लोकेल को शामिल किया और इससे समस्या हल हो गई। मैं अर्जेंटीना से हूं और सेवा यूएसए में है। तो Locale.ENGLISH का उपयोग करना ही काफी था।
 – 
Ariel Vazquez
21 पद 2020, 14:50