2015-09-28 11 views
7

मेरे पास दो पूर्णांक हैं: year और week। मैं इन दो मूल्यों से LocalDateTime बनाना चाहता हूं, जहां तारीख विशेष वर्ष के विशेष सप्ताह के पहले दिन का प्रतिनिधित्व करती है।वर्ष के सप्ताह और सप्ताह के आधार पर स्थानीय दिनांक प्राप्त करें

मैं पहले से ही करने की कोशिश की इस:

LocalDateTime ldt = LocalDateTime.of(year, 1, 1, 0, 0).plusWeeks(week-1); 

यह सही परिणाम नहीं दे करता है क्योंकि साल के पहले दिन हमेशा उस वर्ष के पहले सप्ताह की शुरुआत नहीं है। मुझे यह पता लगाना प्रतीत नहीं होता कि पहले सप्ताह के पहले दिन को कैसे प्राप्त किया जाए।

जावा 8 में दिनांक और समय API के साथ ऐसा करने का कोई आसान तरीका है?

नोट: मुझे पता है कि मैं here दिए गए उत्तरों के साथ एक समाधान भी बना सकता हूं, लेकिन ऐसा लगता है कि यह बहुत दूर है। शायद यह नहीं है, यदि हां, तो मुझे बताएं!

+0

सप्ताह नंबरिंग भाषा-विशिष्ट है, इसलिए उन दो डेटा पॉइंट आपको एक सटीक तारीख नहीं देंगे। AFAIK 'LocalDateTime' उस तथ्य को संभाल नहीं करता है लेकिन 'ग्रेगोरियन कैलेंडर' करता है। – biziclop

+0

@biziclop मुझे लगता है कि वह वही है जो वह चाहता है। एक लोकेल-विशिष्ट सप्ताह "1" - इसलिए कुछ लोगों के लिए पहले 4-दिन-सप्ताह, दूसरों के लिए कुछ और। – dognose

+0

@ डोग्नोज़ फिर 'ग्रेगोरियन कैलेंडर' वास्तव में जाने का तरीका है। – biziclop

उत्तर

9

निम्नलिखित कोड एक LocalDateTime हो और भी वर्ष के लिए दिया सप्ताह के साल के पहले दिन के लिए सेट होगा:

int week = 1; 
int year = 2016; 
WeekFields weekFields = WeekFields.of(Locale.getDefault()); 
LocalDateTime ldt = LocalDateTime.now() 
          .withYear(year) 
          .with(weekFields.weekOfYear(), week) 
          .with(weekFields.dayOfWeek(), 1); 
System.out.println(ldt); 

ध्यान दें कि सप्ताह के-साल की धारणा स्थान है विशिष्ट। यहां, मैंने डिफ़ॉल्ट लोकेल का उपयोग किया लेकिन आपको उपयोगकर्ता द्वारा प्रदत्त लोकेल का उपयोग करने की आवश्यकता हो सकती है।

यदि आप समय भाग से छुटकारा पाने के लिए चाहते हैं, तो आप truncatedTo(ChronoUnit.DAYS) पर कॉल जोड़ सकते हैं।

3

आप दिन आप में रुचि रखते हैं की एक स्ट्रिंग प्रतिनिधित्व पार्स करने के लिए कोशिश कर सकते:

private static final DateTimeFormatter YEAR_WEEK = DateTimeFormatter.ofPattern("YYYY-w-e", Locale.getDefault()); 

public static LocalDate fromYearWeek(int year, int week) { 
    return LocalDate.parse(year + "-" + week + "-1", YEAR_WEEK); 
} 

आप एक LocalDateTime की जरूरत है, तो आप localDate.atTime(...) या localDate.atStartOfDay() उदाहरण के लिए उपयोग कर सकते हैं।

2
LocalDate ld = LocalDate.parse("2012-W48-1", DateTimeFormatter.ISO_WEEK_DATE); 
+0

इस उत्तर के लिए धन्यवाद! मुझे लगता है कि यह assylias के जवाब के समान है और थोड़ा अपूर्ण भी है। हो सकता है कि आप यह समझाने के लिए संपादित कर सकें कि यह अलग क्यों है। – bashoogzaad

+0

यह समान है लेकिन अतिरिक्त स्थानीयडेट उदाहरण – Vovka

1

ThreeTen-अतिरिक्त

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

यदि "सप्ताह" से आपका मानक ISO 8601 definition of a week-of-year था, जहां सप्ताह # 1 में वर्ष का पहला गुरुवार होता है, तो YearWeek कक्षा आपके लिए काम करे।

int weekBasedYear = 2015; // Not the calendar year! 
int weekOfYear = 1; 
YearWeek yearWeek = YearWeek.of (weekBasedYear , weekOfYear); 

आप एक LocalDate वस्तु में प्रतिनिधित्व एक तिथि-केवल मूल्य मिल सकता है। निर्दिष्ट करें कि आप किस दिन के सप्ताह DayOfWeek एनम का उपयोग करना चाहते हैं, जहां सोमवार सप्ताह का पहला दिन है, और रविवार अंतिम दिन है। याद रखें कि एक आईएसओ सप्ताह हमेशा सोमवार को शुरू होता है और हमेशा रविवार को समाप्त होता है।

LocalDate mondayOfYearWeek = yearWeek.atDay (DayOfWeek.MONDAY); 
LocalDate sundayOfYearWeek = yearWeek.atDay (DayOfWeek.SUNDAY); 

कंसोल पर डंप करें। ध्यान दें कि पिछले कैलेंडर वर्ष (2014) में सप्ताह कैसे शुरू होता है और 2015 में समाप्त होता है, क्योंकि 1 जनवरी, 2015 गुरुवार है इसलिए यह आईएसओ सप्ताह # 1 को चिह्नित करता है। निम्नलिखित रविवार, 4 जनवरी, 2015 आईएसओ सप्ताह # 1 समाप्त करता है।

System.out.println ("yearWeek: " + yearWeek + " starts on mondayOfYearWeek: " + mondayOfYearWeek + " and ends on sundayOfYearWeek: " + sundayOfYearWeek); 

वर्ष सप्ताह: 2015-W01 mondayOfYearWeek पर शुरू होता है: 2014-12-29 और sundayOfYearWeek पर समाप्त होता है: एक वर्ष के भीतर 2015-01-04

+1

के निर्माण से बचें यह अच्छा है लेकिन समस्या एक और निर्भरता का उपयोग कर रही है। मेरी इच्छा है कि इस सहज ज्ञान युक्त एपीआई को जेडीके में ही जोड़ा जाए। –

संबंधित मुद्दे