डेट कमांड का उपयोग यह जानने के लिए करें कि "सप्ताह 40" सोमवार किस तारीख को होगा?


11

मैं "कमांड सप्ताह 40" जैसे कुछ को आईएसओ तिथि में बदलने के लिए दिनांक कमांड का उपयोग कैसे कर सकता हूं?

मैं कुछ इस तरह से खेल रहा हूं:

date --date='monday week 40' +'%Y-%m-%d'

और मैं जिस तारीख को खोज रहा हूं वह 2011-10-03 होगी।

लेकिन मेरी समस्या यह है कि यह तारीख स्ट्रिंग मान्य नहीं है, इसलिए मुझे इस समस्या को हल करने के लिए एक और दृष्टिकोण की आवश्यकता है।

/धन्यवाद


निम्नलिखित लिंक इस बात के बारे में है कि वर्ष के किस दिन एक निर्धारित सप्ताह शुरू होता है। वीक नंबरिंग (विकिपीडिया) .. यह प्रभावी रूप से बताता है कि इस वर्ष की पहली जनसुनवाई आईएसओ सप्ताह 52 में क्यों है .. 'उपयोगकर्ता अज्ञात'%V द्वारा उपयोग किए गए प्रारूप अनुक्रम आईएसओ सप्ताह की संख्या की रिपोर्ट करते हैं।
पीटर.ओ।

जवाबों:


4

वास्तव में बदसूरत और शायद केवल GNU के साथ काम करता है date:

date -d "$( date -d "$( date +'%Y-01-01' ) +40 weeks") -$( date -d "$( date +'%Y-01-01' ) +40 weeks" +'%w' ) days+1 day" +'%Y-%m-%d'

केवल आपके 3 अक्टूबर के उदाहरण के लिए परीक्षण किया गया, कुछ अन्य मामलों के लिए विफल हो सकता है।


अद्यतन : यदि आपके पास एक गैर संलग्न स्थान है, तो आपको काम करने के लिए आंतरिक तिथि से आउटपुट निर्दिष्ट करने की आवश्यकता है। (और% F सिर्फ YYYY-MM-DD है)।

date -d "$(date -d "$(date +'%Y-01-01') +40 weeks" +"%F") -$(date -d "$(date +'%Y-01-01') +40 weeks" +%w) days +1 day" +"%F"

1
आप इनर डेट से आउटपुट को फॉर्मेट करने से चूक गए ताकि बाहरी इसका सही इस्तेमाल कर सकें।
जोहान

@ जोहान, मुझे डिफ़ॉल्ट प्रारूप का उपयोग करने में कोई समस्या नहीं थी। शायद यह स्थानीय विशिष्ट है? मैं en_US का उपयोग करता हूं। वैसे भी अच्छी बात है।
मैनेटवर्क

तारीख के लिए मैं स्वीडिश लोकेल का उपयोग करता हूं, इसलिए अंतर है।
जोहान

स्थानीय समायोजन के लिए धन्यवाद। मेरे पास एक कस्टम दिनांक प्रारूप है और एक ही समस्या थी .. मैंने इसे लगभग हल कर लिया था, लेकिन अब आपने इसे पोस्ट किया है मैं आपके ट्वीक का उपयोग करूँगा; यह बेहतर है।
पीटर।

इसके लिए वन-लाइनर होने की कोई आवश्यकता नहीं थी। यह बेहतर होगा कि यह कैसे काम करता है यह स्पष्ट करने के लिए वर्णनात्मक नामों के साथ अस्थायी चर का उपयोग करते हुए, इसे कई लाइनों में विभाजित किया जाए। यह भी माना जाता है कि जन 1 प्रत्येक वर्ष एक ही सप्ताह की संख्या में है, जो @ पीटर ओ द्वारा पहले से ही नोट किया गया मामला नहीं है
एडम स्पीयर्स

5

एक वैकल्पिक दृष्टिकोण:

date --date "+$((40-$(date +%V)))weeks last monday"  +"%F"
  • 40 वह सप्ताह है जिसे आप खोजते हैं
  • दिनांक +% V वर्तमान सप्ताह लौटाता है (35)
  • 40-35 = 5, जो जोड़ने के लिए हफ्तों की संख्या है
  • वहाँ से, आखिरी सोमवार की तलाश करें

अच्छा है, और यह मेरी कस्टम तिथि सेटिंग के साथ काम करता है।
पीटर।

यह एक चतुर विचार है, लेकिन यह काम नहीं करता है। उदाहरण के लिए, यदि आज सोमवार सप्ताह 41 (यानी date +%Vरिटर्न 41) में है, तो --dateपैरामीटर मान होगा +-1weeks last monday, जो वास्तव में एक पखवाड़े पहले है, 7 दिन पहले नहीं।
एडम स्पियर्स

मुझे यकीन नहीं है कि मैं आपकी आलोचना को समझता हूं। यह इस वर्ष 2013 है, इसलिए प्रश्न से उदाहरण फिट नहीं होता है। प्रश्न के लिए पूर्ण तिथि क्या होनी चाहिए, और इसके बजाय मेरा दृष्टिकोण क्या है (शायद: क्यों)?
उपयोगकर्ता अज्ञात

@AdamSpiers: मेरा कैलेंडर सोमवार, सप्ताह 40 सितंबर को 30 वें दिन तक प्रदर्शित होता है। यह वही है जो मेरे एलिया की पैदावार (आज) है।
उपयोगकर्ता अज्ञात

@userunknown ऐसा इसलिए है क्योंकि आप आज अपने कोड का परीक्षण कर रहे हैं, जो कि मंगलवार है, जो सोमवार के बाद आता है। अगर आपने कल अपने कोड का परीक्षण किया होता तो वह टूट जाता। इसे और अधिक स्पष्ट करने के लिए, दौड़ने का प्रयास करें date -d 'last monday'। यह कल लौट आएगा। आपको क्या लगता है कि अगर आपने इसे कल चलाया होता तो क्या होता?
एडम स्पेयर्स

1

ठीक है, यहाँ मेरा प्रयास है। यह अन्य उत्तरों से विचारों को चुराता है, और तर्क का पालन करना आसान बनाने का प्रयास करता है। यह आईएसओ 8601 प्रणाली पर आधारित है, इसलिए यह सही नहीं होगा यदि आप संयुक्त राज्य अमेरिका या कनाडा जैसे देशों में रहते हैं, लेकिन उन देशों के लिए आसानी से समायोज्य होना चाहिए।

# sets $week_start to a representation of Monday of the given week
# number formatted via the given format, and similarly sets
# $week_end to Friday of the same week.
get_week_range () {
    week_num="$1" date_format="$2"

    # Most of the world adhere to ISO 8601 which states that weeks begin on Monday
    # and Jan 4th is always in week #1:
    #
    #   http://en.wikipedia.org/wiki/ISO_week_date
    #
    # For other week numbering systems (e.g. USA, Canada), see:
    #
    #   http://en.wikipedia.org/wiki/Seven-day_week#Week_numbering
    day_in_week_1=$( date +'%Y-01-04' )
    day_num_in_week_1=$( date -d $day_in_week_1 +%u ) # 1 is Monday
    days_from_week_1_start=$(( $day_num_in_week_1 - 1 ))
    # This is a Monday:
    start_of_week_1=$( date -d "$day_in_week_1 - $days_from_week_1_start days" +%F )

    week_delta="$(( $week_num - 1 ))"
    # Monday:
    week_start=$( date -d "$start_of_week_1 + $week_delta weeks"          +"$date_format" )
    # Friday:
    week_end=$(   date -d "$start_of_week_1 + $week_delta weeks + 4 days" +"$date_format" )
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.