“Pazartesi 40. hafta” nın hangi tarih olacağını öğrenmek için date komutunu nasıl kullanabilirim?


11

"Pazartesi 40. hafta" gibi bir şeyi ISO tarihine dönüştürmek için date komutunu nasıl kullanabilirim?

Ben böyle bir şeyle oynuyorum:

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

Ve aradığım tarih 2011-10-03.

Ama benim sorunum bu tarih dize geçerli değil, bu yüzden bu sorunu çözmek için başka bir yaklaşım gerekir.

/Teşekkürler


Aşağıdaki bağlantı, numaralı bir haftanın yılın hangi gününde başladığını belirleyen şeyle ilgilidir . Hafta numaralandırma (Wikipedia) .. Bu yılın 1 Ocak ayının neden ISO 52. haftada olduğunu etkili bir şekilde açıklar %V. 'Kullanıcı bilinmiyor' tarafından kullanılan format dizisi ISO hafta numarasını bildirir.
Peter.O

Yanıtlar:


4

Gerçekten çirkin ve muhtemelen sadece GNU ile çalışır 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'

Yalnızca 3 Ekim örneğiniz için test edilmiştir, diğer bazı durumlarda başarısız olabilir.


Güncelleme : Eng olmayan bir yerel ayarınız varsa, çalışmaya başlamak için iç tarihten çıktıyı belirtmeniz gerekir. (Ve% F sadece YYYY-AA-GG).

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
Dış tarihi doğru kullanabilmek için çıktıyı iç tarihten biçimlendirmeyi kaçırdınız.
Johan

@Johan, varsayılan biçimi kullanmayla ilgili hiçbir sorun yaşamadım. Belki bölgeye özgüdür? En_US kullanıyorum. Yine de iyi bir nokta.
manatwork

Tarih için İsveç yerel ayarını kullanıyorum, bu yüzden fark var.
Johan

Yerel ayar için teşekkürler. Özel bir tarih biçimim var ve aynı sorun vardı .. Neredeyse hallettim, ama şimdi yayınladın tweak kullanacağım; daha iyi.
Peter.O

Bunun tek astar olmasına gerek yoktu. Nasıl çalıştığını netleştirmek için açıklayıcı adlara sahip geçici değişkenler kullanarak bunu birden çok satıra bölmek daha iyi olur. Ayrıca, 1 Ocak'ın her yıl aynı hafta numarası olduğunu varsayar; bu, @ Peter.O tarafından daha önce belirtildiği gibi değildir .
Adam Spires

5

Alternatif bir yaklaşım:

date --date "+$((40-$(date +%V)))weeks last monday"  +"%F"
  • 40 hafta aradığınız hafta
  • tarih +% V geçerli haftayı döndürür (35)
  • 40-35 = 5, eklenecek hafta sayısı
  • oradan, son pazartesi ara

iyi bir tane ve özel tarih ayarımla çalışıyor.
Peter.O

Bu akıllıca bir fikir, ama işe yaramıyor. Örneğin, bugün 41. haftada Pazartesi ise (yani date +%Vdöndürür 41), --dateparametre değeri +-1weeks last monday7 gün önce değil, iki hafta önce gerçekleşir.
Adam Spires

Eleştirinizi anladığımdan emin değilim. Bu yıl 2013, bu yüzden sorudan gelen örnek uymuyor. Soru için kesin tarih ne olmalı ve benim yaklaşımım bunun yerine neye dönüyor (belki: neden)?
kullanıcı bilinmiyor

@AdamSpiers: Takvimim, algo'mun (bugün) vereceği şey olan 40 Eylül'ün 30 Eylül Pazartesi günü olarak görüntüleniyor.
kullanıcı bilinmiyor

@userunknown Çünkü kodunuzu bugün test ediyorsunuz, salı, Pazartesi'den sonra geliyor. Eğer kodunuzu dün deneseydiniz, kod kırılmış olurdu. Daha açık hale getirmek için koşmayı deneyin date -d 'last monday'. Dün geri dönecek. Dün çalıştırsaydın ne söyleyeceğini düşünüyorsun?
Adam Spires

1

Tamam, işte benim girişimim. Diğer cevaplardan gelen fikirleri çalar ve mantığı daha kolay takip etmeye çalışır. Bu ISO 8601 sistemine dayanmaktadır, bu nedenle ABD veya Kanada gibi ülkelerde yaşıyorsanız doğru olmayacaktır, ancak bu ülkeler için kolayca ayarlanabilir olmalıdır.

# 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" )
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.