SimpleDateFormat और लोकेल आधारित प्रारूप स्ट्रिंग


83

मैं दिए गए स्थान के आधार पर विभिन्न तरीकों से जावा में एक तारीख को प्रारूपित करने की कोशिश कर रहा हूं। उदाहरण के लिए, मैं चाहता हूँ कि अंग्रेजी उपयोगकर्ता "Nov 1, 2009" ("MMM d, yyyy" द्वारा स्वरूपित) और नार्वेजियन उपयोगकर्ता "1. nov। 2009" ("d। MMM। Yyyy") देखें।

यदि मैं SimpleDateFormat निर्माता में लोकेल जोड़ता हूं, तो महीने का हिस्सा ठीक काम करता है, लेकिन बाकी के बारे में क्या?

मैं उम्मीद कर रहा था कि मैं SimpleDateFormat के साथ स्थानों के साथ जोड़े गए प्रारूप स्ट्रिंग जोड़ सकता हूं, लेकिन मुझे ऐसा करने का कोई तरीका नहीं मिल सकता है। क्या यह संभव है या क्या मुझे अपने कोड को लोकेल की जांच करने और संगत प्रारूप स्ट्रिंग जोड़ने की आवश्यकता है?


1
FYI करें, जैसे परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और जावा 9. देखें में बनाया गया वर्गों ट्यूटोरियल ओरेकल द्वारा
तुलसी बॉर्क

जवाबों:


86

उपयोग DateFormat.getDateInstance (पूर्णांक शैली, लोकेल लोकेल) के बजाय साथ अपने स्वयं के पैटर्न बनाने की SimpleDateFormat


1
धन्यवाद, यह ठीक काम करता है। मैं DateFormat.Long के लिए गया था जो मेरी सबसे अच्छी जरूरत के अनुरूप है। BTW, नॉर्वेजियन लोकेल और DateFormat.MEDIUM बकवास है (!)
fiskeben

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

2
FYI करें, परेशान करने वाली कक्षाएं java.util.Dateऔर SimpleDateFormatअब विरासत हैं, java.time कक्षाओं द्वारा दबा दी गई हैं।
बेसिल बोर्क डे

88

SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy", Locale.ENGLISH);
String formatted = dateFormat.format(the_date_you_want_here);

29

शैली + लोकेल का उपयोग करें : DateFormat.getDateInstance (इंट स्टाइल, लोकेल लोकेल)

चेक http://java.sun.com/j2se/1.5.0/docs/api/java/text/DateFormat.html

अंतर देखने के लिए निम्न उदाहरण चलाएँ:

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatDemoSO {
  public static void main(String args[]) {
    int style = DateFormat.MEDIUM;
    //Also try with style = DateFormat.FULL and DateFormat.SHORT
    Date date = new Date();
    DateFormat df;
    df = DateFormat.getDateInstance(style, Locale.UK);
    System.out.println("United Kingdom: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.US);
    System.out.println("USA: " + df.format(date));   
    df = DateFormat.getDateInstance(style, Locale.FRANCE);
    System.out.println("France: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.ITALY);
    System.out.println("Italy: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.JAPAN);
    System.out.println("Japan: " + df.format(date));
  }
}

आउटपुट:

United Kingdom: 25-Sep-2017
USA: Sep 25, 2017
France: 25 sept. 2017
Italy: 25-set-2017
Japan: 2017/09/25

1
शैलियों DateFormat.LONGऔर मत भूलना DateFormat.DEFAULT!
जेडीजे

6
अपने कोड का आउटपुट जोड़ना अधिक पूर्ण होगा
sam

1
शैली और स्थान निर्दिष्ट करने के लिए सही विचार। लेकिन इस्तेमाल की जाने वाली कक्षाएं अब बहिष्कृत हो गई हैं। पुराने डेट-टाइम क्लासेस जैसे कि java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब विरासत है , जावा 8 और जावा 9 में निर्मित java.time कक्षाओं द्वारा दबाया गया है । ओरेकल द्वारा ट्यूटोरियल देखें ।
तुलसी बॉर्क

15

tl; डॉ

LocalDate.now().format(
    DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
                     .withLocale( new Locale( "no" , "NO" ) )
)

के परेशानी वाले वर्ग java.util.Dateऔर SimpleDateFormatअब विरासत हैं, java.time कक्षाओं द्वारा दबाए गए।

LocalDate

LocalDateवर्ग समय के दिन और समय क्षेत्र के बिना बिना एक दिनांक-केवल मूल्य का प्रतिनिधित्व करता।

एक तिथि निर्धारित करने में एक समय क्षेत्र महत्वपूर्ण है। किसी भी क्षण के लिए, तिथि क्षेत्र के अनुसार दुनिया भर में भिन्न होती है। उदाहरण के लिए, पेरिस फ्रांस में मध्यरात्रि के कुछ मिनट बाद एक नया दिन है जबकि अभी भी "कल" मॉन्ट्रियल क्यूबेक में है

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

DateTimeFormatter

DateTimeFormatterकेवल दिनांक-भाग या समय-भाग का प्रतिनिधित्व करने वाले तार उत्पन्न करने के लिए उपयोग करें ।

DateTimeFormatterवर्ग स्वचालित रूप से कर सकते हैं स्थानीय बनाना

निर्दिष्ट करने के लिए, निर्दिष्ट करें:

  • FormatStyle यह निर्धारित करने के लिए कि स्ट्रिंग कितनी लंबी या संक्षिप्त होनी चाहिए।
  • Locale निर्धारित करने के लिए (ए) दिन के नाम, महीने का नाम और इस तरह के अनुवाद के लिए मानव भाषा, और (ख) संक्षिप्त नाम, पूंजीकरण, विराम चिह्न, और इस तरह के मुद्दों का निर्णय लेने वाले सांस्कृतिक मानदंडों।

उदाहरण:

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );

दूसरी दिशा में जा रहे हैं, आप एक स्थानीय स्ट्रिंग को पार्स कर सकते हैं।

LocalDate ld = LocalDate.parse( input , f );

ध्यान दें कि स्थानीय और समय क्षेत्र पूरी तरह से रूढ़िवादी मुद्दे हैं। आपके पास एक मॉन्ट्रियल पल जापानी भाषा में या ऑकलैंड न्यूजीलैंड क्षण हिंदी भाषा में प्रस्तुत किया जा सकता है।

एक और उदाहरण: बदलें 6 junio 2012(स्पेनिश) से 2012-06-06(मानक आईएसओ 8601 प्रारूप)। Java.time कक्षाएं आईएसओ 8601 फॉर्मेट को डिफ़ॉल्ट रूप से पार्सिंग / जनरेटिंग स्ट्रिंग्स के लिए उपयोग करती हैं।

String input = "6 junio 2012";
Locale l = new Locale ( "es" , "ES" );
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l );
LocalDate ld = LocalDate.parse ( input , f );
String output = ld.toString();  // 2012-06-06. 

Peruse प्रारूप

यहां कई स्थानों में कई स्वरूपों के परिणामों को स्वचालित रूप से स्थानीयकृत करने के लिए कुछ उदाहरण कोड दिए गए हैं।

एक EnumSetके एक कार्यान्वयन है Set, अत्यधिक दोनों कम स्मृति के उपयोग और तेजी से निष्पादन की गति जब इकट्ठा करने के लिए अनुकूलित Enumवस्तुओं। तो, EnumSet.allOf( FormatStyle.class )हमें FormatStyleएनम ऑब्जेक्ट्स के सभी चार को लूप करने का संग्रह देता है । अधिक जानकारी के लिए, enum प्रकारों पर Oracle ट्यूटोरियल देखें ।

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 );

List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "no" , "NO" ) );
locales.add( Locale.US );

// Or use all locales (almost 800 of them, for about 120K text results).
// Locale[] locales = Locale.getAvailableLocales(); // All known locales. Almost 800 of them.

for ( Locale locale : locales )
{
    System.out.println( "------|  LOCALE: " + locale + " — " + locale.getDisplayName() + "  |----------------------------------" + System.lineSeparator() );

    for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
    {
        DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
        String output = ld.format( f );
        System.out.println( output );
    }
    System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );

आउटपुट।

------|  LOCALE: fr_CA — French (Canada)  |----------------------------------

mardi 23 janvier 2018
23 janvier 2018
23 janv. 2018
18-01-23

------|  LOCALE: no_NO — Norwegian (Norway)  |----------------------------------

tirsdag 23. januar 2018
23. januar 2018
23. jan. 2018
23.01.2018

------|  LOCALE: en_US — English (United States)  |----------------------------------

Tuesday, January 23, 2018
January 23, 2018
Jan 23, 2018
1/23/18

« fin »

जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।

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

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

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

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


7

दिनांक स्ट्रिंग का स्थानीयकरण:

रेडसन के पद पर आधारित:

private String localizeDate(String inputdate, Locale locale) { 

    Date date = new Date();
    SimpleDateFormat dateFormatCN = new SimpleDateFormat("dd-MMM-yyyy", locale);       
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");


    try {
        date = dateFormat.parse(inputdate);
    } catch (ParseException e) {
        log.warn("Input date was not correct. Can not localize it.");
        return inputdate;
    }
    return dateFormatCN.format(date);
}

String localizedDate = localizeDate("05-Sep-2013", new Locale("zh","CN"));

05- 九月 -2013 की तरह होगा


4

यह उपयोगकर्ता के वर्तमान स्थान के अनुसार दिनांक प्रदर्शित करेगा :

दिनांक और समय वापस करने के लिए:

import java.text.DateFormat;    
import java.util.Date;

Date date = new Date();
DateFormat df = DateFormat.getDateTimeInstance();
String myDate = df.format(date);

दिसम्बर 31, 1969 7:00:02 अपराह्न

केवल तारीख वापस करने के लिए, उपयोग करें:

DateFormat.getDateInstance() 

31 दिसंबर, 1969


1

किसी दिए गए दिनांक के लिए जावा 8 स्टाइल

LocalDate today = LocalDate.of(1982, Month.AUGUST, 31);
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.ENGLISH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.FRENCH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.JAPANESE)));

मेरा मानना ​​है कि मैंने एक साल पहले इस तरह के समाधान को कवर किया था।
बेसिल बॉर्क


0

आशा है कि यह किसी की मदद करता है। कृपया नीचे दिए गए कोड में खोजें जो लोकेल उदाहरण को स्वीकार करता है और स्थानीय विशिष्ट दिनांक प्रारूप / पैटर्न को लौटाता है।

public static String getLocaleDatePattern(Locale locale) {
    // Validating if Locale instance is null
    if (locale == null || locale.getLanguage() == null) {
        return "MM/dd/yyyy";
    }
    // Fetching the locale specific date pattern
    String localeDatePattern = ((SimpleDateFormat) DateFormat.getDateInstance(
            DateFormat.SHORT, locale)).toPattern();
    // Validating if locale type is having language code for Chinese and country
    // code for (Hong Kong) with Date Format as - yy'?'M'?'d'?'
    if (locale.toString().equalsIgnoreCase("zh_hk")) {
        // Expected application Date Format for Chinese (Hong Kong) locale type
        return "yyyy'MM'dd";
    }
    // Replacing all d|m|y OR Gy with dd|MM|yyyy as per the locale date pattern
    localeDatePattern = localeDatePattern.replaceAll("d{1,2}", "dd")
            .replaceAll("M{1,2}", "MM")
            .replaceAll("y{1,4}|Gy", "yyyy");
    // Replacing all blank spaces in the locale date pattern
    localeDatePattern = localeDatePattern.replace(" ", "");
    // Validating the date pattern length to remove any extract characters
    if (localeDatePattern.length() > 10) {
        // Keeping the standard length as expected by the application
        localeDatePattern = localeDatePattern.substring(0, 10);
    }
    return localeDatePattern;
}

-2

Java8

 import java.time.format.DateTimeFormatter;         
 myDate.format(DateTimeFormatter.ofPattern("dd-MMM-YYYY",new Locale("ar")))

ofPatternस्थानीय तर्क के साथ उपयोग करने से आपको वांछित भाषा में महीने का नाम मिलेगा, लेकिन प्रश्न में अनुरोध के अनुसार अलग-अलग प्रारूप नहीं। अपरकेस का उपयोग करना YYYYआपको कोने के मामलों में गलत और बहुत ही आश्चर्यजनक परिणाम देगा। Java 8 का उपयोग करना एक अच्छा विचार है।
ओले वीवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.