จะใช้คำสั่ง date เพื่อค้นหาว่าวันใด“ วันจันทร์สัปดาห์ที่ 40” จะเป็นวันใด?


11

ฉันจะใช้คำสั่ง date เพื่อแปลงบางสิ่งเช่น "วันจันทร์ 40 สัปดาห์" เป็นวันที่ ISO ได้อย่างไร

ฉันกำลังเล่นกับสิ่งนี้:

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

และวันที่ฉันค้นหาจะเป็น 2011-10-03

แต่ปัญหาของฉันคือสตริงวันที่นี้ไม่ถูกต้องดังนั้นฉันต้องการวิธีการอื่นในการแก้ปัญหานี้

/ ขอบคุณ


ลิงค์ต่อไปนี้เกี่ยวกับสิ่งที่กำหนดในวันที่ของสัปดาห์ที่มีหมายเลขเริ่มต้น การกำหนดหมายเลขสัปดาห์ (Wikipedia) .. อธิบายได้อย่างมีประสิทธิภาพว่าเหตุใดวันที่ 1 มกราคมของปีนี้อยู่ใน ISO Week 52 .. %Vลำดับการจัดรูปแบบที่ใช้โดย'ผู้ใช้ที่ไม่รู้จัก'รายงานหมายเลขสัปดาห์ของ ISO
Peter.O

คำตอบ:


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
คุณพลาดการจัดรูปแบบผลลัพธ์จากวันที่ภายในเพื่อให้ด้านนอกสามารถใช้งานได้อย่างถูกต้อง
Johan

@ โจฮันฉันไม่มีปัญหากับการใช้รูปแบบเริ่มต้น อาจจะเป็นสถานที่ที่เฉพาะเจาะจง? ฉันใช้ en_US จุดดีอยู่แล้ว
จัดการ

สำหรับวันที่ฉันใช้ภาษาสวีเดนดังนั้นจึงมีความแตกต่าง
Johan

ขอบคุณสำหรับการปรับเปลี่ยนสถานที่ ฉันมีรูปแบบวันที่ที่กำหนดเองและมีปัญหาเดียวกัน .. ฉันเกือบจะเรียงลำดับแล้ว แต่ตอนนี้คุณโพสต์แล้วฉันจะใช้การปรับแต่งของคุณ มันจะดีกว่า.
Peter.O

ไม่มีข้อกำหนดสำหรับสิ่งนี้ที่จะเป็นหนึ่งซับ มันจะเป็นการดีกว่าถ้าจะแบ่งออกเป็นหลาย ๆ บรรทัดโดยใช้ตัวแปรชั่วคราวที่มีชื่ออธิบายเพื่อให้ชัดเจนว่ามันทำงานอย่างไร นอกจากนี้ยังอนุมานว่า 1 มกราคมอยู่ในสัปดาห์เดียวกันทุกปีซึ่งไม่ใช่กรณีที่ระบุไว้โดย @ Peter.O
Adam Spires

5

ทางเลือกอื่น:

date --date "+$((40-$(date +%V)))weeks last monday"  +"%F"
  • 40 คือสัปดาห์ที่คุณค้นหา
  • date +% V ส่งคืนสัปดาห์ปัจจุบัน (35)
  • 40-35 = 5 ซึ่งเป็นจำนวนสัปดาห์ที่จะเพิ่ม
  • จากที่นั่นค้นหาวันจันทร์สุดท้าย

ดีมากและใช้ได้กับการตั้งค่าวันที่ที่กำหนดเองของฉัน
Peter.O

นี่เป็นความคิดที่ฉลาด แต่ไม่ได้ผล ตัวอย่างเช่นหากวันนี้เป็นวันจันทร์ในสัปดาห์ที่ 41 (เช่นdate +%Vส่งคืน41) --dateค่าพารามิเตอร์จะ+-1weeks last mondayเป็นจริงซึ่งเป็นรายปักษ์ที่ผ่านมาไม่ใช่ 7 วันที่ผ่านมา
Adam Spires

ฉันไม่แน่ใจว่าฉันเข้าใจคำวิจารณ์ของคุณหรือไม่ ปี 2556 เป็นปีนี้ดังนั้นตัวอย่างจากคำถามจึงไม่เหมาะสม วันที่แน่นอนของคำถามคืออะไรและแนวทางของฉันกลับมาเป็นอย่างไร (อาจ: ทำไม)
ผู้ใช้ที่ไม่รู้จัก

@ AdamSpiers: ปฏิทินของฉันแสดงเป็นวันจันทร์สัปดาห์ที่ 40 ของวันที่ 30 กันยายนซึ่งเป็นสิ่งที่ฉันได้รับ (วันนี้)
ผู้ใช้ที่ไม่รู้จัก

@userunknown นั่นเป็นเพราะคุณกำลังทดสอบโค้ดของคุณวันนี้ซึ่งเป็นวันอังคารซึ่งมาหลังจากวันจันทร์ หากคุณทดสอบรหัสของคุณเมื่อวานนี้มันจะพัง date -d 'last monday'ที่จะทำให้มันชัดเจนมากขึ้นลองใช้ มันจะกลับมาเมื่อวานนี้ คุณคิดว่ามันจะพูดอะไรถ้าคุณใช้เมื่อวานนี้?
Adam Spires

1

ตกลงนี่คือความพยายามของฉัน มันขโมยความคิดจากคำตอบอื่น ๆ และพยายามทำให้ตรรกะง่ายต่อการติดตาม สิ่งนี้เป็นไปตามระบบ ISO 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" )
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.