java - क्यों 31 दिसंबर 2010 साल के सप्ताह के रूप में 1 लौटाता है?




calendar jodatime week-number (6)

उदाहरण के लिए:

Calendar c = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
out.println( c.get( Calendar.WEEK_OF_YEAR ) );  

प्रिंट 1

जोदा समय के साथ ही होता है।

:)


Answers

tl; डॉ

java.time.LocalDate.parse( 
    "31/12/2010" , 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.UK )  
)      
.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )

52

या, एक पुस्तकालय जोड़ें, और फिर ...

org.threeten.extra.YearWeek.from(     // Convert from a `LocalDate` object to a `YearWeek` object representing the entire week of that date’s week-based year.
    java.time.LocalDate.parse( "31/12/2010" , DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.UK )  
).getWeek()                           // Extract an integer number of that week of week-based-year, either 1-52 or 1-53 depending on the year.

52

java.time

जैसा कि अन्य ने नोट किया, एक सप्ताह की परिभाषा पुराने java.util.Calendarjava.util.Calendarjava.util.Calendar वर्ग में भिन्न होती है।

वह परेशानी वर्ग, और उसके साथी java.util.Date , Java 8 और बाद में जावा में बनाए गए java.time फ्रेमवर्क द्वारा java.time किया गया है।

IsoFields कक्षा आईएसओ 8601 मानक का उपयोग करके एक सप्ताह परिभाषित करती है: सप्ताह हमेशा सोमवार को शुरू होता है, और सप्ताह # 1 कैलेंडर वर्ष के पहले गुरुवार को रखता है।

वर्तमान क्षण प्राप्त करें।

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );

मानक सप्ताह-आधारित वर्ष के बारे में पूछें।

int week = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );

मानक सप्ताह परिभाषा

"एक सप्ताह" और "वर्ष के पहले सप्ताह" को परिभाषित करने के कई तरीके हैं।

हालांकि, एक प्रमुख मानक परिभाषा है : आईएसओ 8601 मानक । वह मानक वर्ष के पहले सप्ताह सहित वर्ष के सप्ताहों को परिभाषित करता है।

सप्ताह के पहले गुरुवार के साथ सप्ताह

सोमवार के साथ एक मानक सप्ताह शुरू होता है और रविवार के साथ समाप्त होता है।

सप्ताह-आधारित वर्ष के सप्ताह # 1 में कैलेंडर वर्ष का पहला गुरुवार है।

जावा.टाइम कक्षाएं आईएसओफ़िल्ड्स कक्षा के माध्यम से आईएसओ 8601 सप्ताह का समर्थन करती हैं, जिसमें तीन स्थिरांक होते हैं जो TemporalField लागू करते हैं:

LocalDate::get कॉल LocalDate::get TemporalField तक पहुंच LocalDate::get करें।

LocalDate ld = LocalDate.parse( "2010-12-31" ) ;
int weekOfWeekBasedYear = ld.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) ;
int yearOfWeekBasedYear = ld.get( IsoFields.WEEK_BASED_YEAR ) ;

ld.toString (): 2010-12-31

सप्ताह OfWeekBasedYear: 52

वर्ष OfWeekBasedYear: 2010

आईएसओ 8601 स्ट्रिंग प्रारूप

आईएसओ 8601 मानक एक पाठ प्रारूप को परिभाषित करता है साथ ही सप्ताह-आधारित-वर्ष मानों के लिए एक अर्थ परिभाषित करता है: yyyy-Www । एक विशिष्ट तारीख के लिए, सोमवार-रविवार के लिए दिन-दर-सप्ताह क्रमांकित 1-7 जोड़ें: yyyy-Www-d

ऐसी स्ट्रिंग का निर्माण करें।

String outputWeek = String.format( "%04d" , yearOfWeekBasedYear ) + "-W" + String.format( "%02d" , weekOfWeekBasedYear ) ;
String outputDate = outputWeek + "-" + ld.getDayOfWeek().getValue() ;

2010-W52-5

YearWeek

यदि आप अपनी परियोजना में ThreeTen-Extra लाइब्रेरी जोड़ते हैं तो यह काम बहुत आसान है। फिर YearWeek कक्षा का उपयोग करें।

YearWeek yw = YearWeek.from( ld ) ;  // Determine ISO 8601 week of a `LocalDate`. 

मानक स्ट्रिंग जेनरेट करें।

String output = yw.toString() ;

2010-W52

और पार्स

YearWeek yearWeek = YearWeek.parse( "2010-W52" ) ;  

yearWeek.toString (): 2010-W52

एक तारीख निर्धारित करें। सोमवार-रविवार को दिन-प्रति-सप्ताह के लिए java.time.DayOfWeek enum ऑब्जेक्ट पास करें।

LocalDate localDate = yw.atDay( DayOfWeek.MONDAY ) ;

localDate.toString (): 2010-12-27

मैं दृढ़ता से इस परियोजना को अपनी परियोजना में जोड़ने की सिफारिश करता हूं। फिर आप गूंगा स्याही के बजाय स्मार्ट ऑब्जेक्ट्स पास कर सकते हैं। ऐसा करने से आपका कोड अधिक आत्म-दस्तावेज बनाता है, type-safety प्रदान करता है, और मान्य मान सुनिश्चित करता है।

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

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

Joda-Time प्रोजेक्ट, अब रखरखाव मोड में , java.time कक्षाओं में माइग्रेशन की सलाह देता है।

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

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

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • जावा एसई 8 , जावा एसई 9 , और बाद में
    • निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और फिक्सेस जोड़ता है।
  • जावा एसई 6 और जावा एसई 7
    • जावाटाइम की अधिकांश कार्यक्षमता को ThreeTen-Backport में जावा 6 और 7 में बैक-पोर्ट किया गया है।
  • Android
    • जावा.टाइम कक्षाओं के एंड्रॉइड बंडल कार्यान्वयन के बाद के संस्करण।
    • पहले एंड्रॉइड के लिए, ThreeTenABP प्रोजेक्ट थ्रीटेन-बैकपोर्ट (ऊपर उल्लिखित) को अपनाने वाला है । देखें थ्रीटेबैप का उपयोग कैसे करें ...।

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

अधिक जानकारी के लिए, इसी तरह के प्रश्न पर मेरा उत्तर देखें:

  • एक तारीख देने के लिए जावा वर्ष का सप्ताह मिलता है

... और इसी तरह के प्रश्न पर मेरा उत्तर देखें:

  • जावा में ISO8601 सप्ताह संख्या से दिनांक की गणना कैसे करें

सप्ताह के सप्ताह की परिभाषा Locale निर्भर है।

अमेरिका में इसे कैसे परिभाषित किया जाता है अन्य पदों में डिस्क किया जाता है। उदाहरण के लिए जर्मनी ( डीआईएन 1355-1 / आईएसओ 8601 ) में: वर्ष का पहला सप्ताह * नए सप्ताह में 4 या अधिक दिनों के साथ पहला सप्ताह है।

* सप्ताह का पहला दिन सोमवार है और सप्ताह का अंतिम दिन रविवार है

और जावा का Calendar लोकेल पर ध्यान देता है। उदाहरण के लिए:

public static void main(String[] args) throws ParseException {

    DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date lastDec2010 = sdf.parse("31/12/2010");

    Calendar calUs = Calendar.getInstance(Locale.US);       
    calUs.setTime(lastDec2010);

    Calendar calDe = Calendar.getInstance(Locale.GERMAN);       
    calDe.setTime(lastDec2010);

    System.out.println( "us: " + calUs.get( Calendar.WEEK_OF_YEAR ) ); 
    System.out.println( "de: " + calDe.get( Calendar.WEEK_OF_YEAR ) );
}

प्रिंट:

us: 1
de: 52

अमेरिका के लिए जोड़ा गया (और मैं सोच सकता हूं कि यह मेक्सिको के लिए भी समान है) 1. सप्ताह का सप्ताह वह सप्ताह है जहां 1. जनवरी का संबंध है। - तो अगर 1. जनवरी एक शनिवार है, तो शुक्रवार (31 दिसंबर) पहले ही इसी सप्ताह का होता है, और इस मामले में यह दिन 1 सप्ताह 2011 का है।


ऐसा इसलिए है क्योंकि सप्ताह की शुरुआत स्थानीय निर्भर है।

अमेरिका में सप्ताह 1 जनवरी से पहले रविवार को शुरू होता है। 2010 में यह 26 दिसंबर है। यही कारण है कि 31 दिसंबर अभी भी सप्ताह 1 है।

यूरोप में सप्ताह 1 पहले 1 जनवरी से पहले सोमवार को शुरू होता है। 2010 में यह 27 दिसंबर है। यही कारण है कि 31 दिसंबर को यूरोप में भी सप्ताह 1 है।


आईआईआरसी, 1 जनवरी की तारीख के साथ पहला सप्ताह सप्ताह 1 है।
यही कारण है कि सप्ताह 1 12/31/2010 के लिए वापस आ गया है।
इसे 12/31/2011 के लिए आज़माएं और आपको 52 मिल जाएगा।

संपादित करें: सप्ताह लोकेल विशिष्ट है, जिसे कभी-कभी रविवार - शनिवार के रूप में परिभाषित किया जाता है, जिसे कभी-कभी सोमवार-रविवार के रूप में परिभाषित किया जाता है


WEEK_OF_YEAR फ़ील्ड रेंज के लिए 1 से 53 तक की गणना की गई मान। एक वर्ष के लिए सप्ताह 1 सबसे पहले सात दिन की अवधि प्राप्त होती है, जो कि फर्स्टडेऑफविक () में शुरू होती है जिसमें उस वर्ष से कम से कम मिनटमाइनडेइन फर्स्टविकैक () दिन होते हैं। इस प्रकार यह प्राप्त करने के मूल्यों पर निर्भर करता है MinimalDaysInFirstWeek (), getFirstDayOfWeek (), और जनवरी 1 के सप्ताह का दिन। अगले वर्ष के एक सप्ताह और सप्ताह 1 के सप्ताह के बीच सप्ताह क्रमशः 2 से 52 या 53 के रूप में गिने जाते हैं (जैसा कि जरूरत है)।

यह निर्धारित करने के लिए कि क्या वह सप्ताह 2010 का आखिरी सप्ताह है या 2011 का पहला जावा getMinimalDaysInFirstWeek का उपयोग करता है। यदि वह विधि 7 लौटाती है तो पहला सप्ताह जिसमें सप्ताह के सभी दिन एक ही वर्ष के होते हैं, सप्ताहांत एक होता है, यदि यह 1 लौटाता है तो अगले सप्ताह के किसी भी दिन के साथ पहला सप्ताह अगले वर्ष का पहला सप्ताह होता है।

इस मामले में 2011 में जनवरी का पहला शनिवार को होता है, इसलिए इसे 2011 का पहला सप्ताह माना जाता है जब तक कि आप एक सप्ताह के साथ एक दिन के साथ पहले ही अगले वर्ष के पहले सप्ताह पर विचार नहीं कर सकते हैं, अगर आप नहीं करते हैं फिर करो:

Calendar c = Calendar.getInstance();
c.setMinimalDaysInFirstWeek(7);//anything more than 1 will work in this year
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
System.out.println( c.get( Calendar.WEEK_OF_YEAR ) ); 

रिटर्न:

52

शुद्ध अटकलें यह है कि आप टर्मिनल का उपयोग कर रहे हैं जो चरित्र-रैपिंग के बजाय word-wrapping करने का प्रयास करता है, और B को शब्द वर्ण के रूप में व्यवहार करता है लेकिन # गैर-शब्द चरित्र के रूप में। तो जब यह लाइन के अंत तक पहुंच जाता है और रेखा को तोड़ने के लिए किसी स्थान की खोज करता है, तो यह लगभग # तुरंत देखता है और खुशी से वहां टूट जाता है; जबकि B साथ, इसे अधिक समय तक खोजना पड़ता है, और इसमें लपेटने के लिए और अधिक टेक्स्ट हो सकता है (जो कुछ टर्मिनल पर महंगा हो सकता है, उदाहरण के लिए, बैकस्पेस आउटपुट करना, फिर लिपटे अक्षरों को ओवरराइट करने के लिए रिक्त स्थान आउटपुट करना)।

लेकिन यह शुद्ध अटकलें है।





java calendar jodatime week-number