Как преобразовать номер недели и день недели в дату

Нет.

Также не существует стандартного метода проверки бесконечности или NaN в Fortran 90/95, а также не может быть стандартного. Не существует стандартного метода определения любого из этих квазицифровых чисел в Fortran 90/95.

-1
задан kvantour 16 January 2019 в 11:31
поделиться

1 ответ

Я сделаю предположение, что номер вашей недели соответствует определению ISO 8601 (другие определения см. В здесь ). Этот стандарт ISO 8601 широко используется в мире: ЕС и большинство других европейских стран, большая часть Азии и Океании

Стандарт ISO 8601 гласит следующее:

[1125 ]
  • В неделе 7 дней
  • Первый день недели - Понедельник
  • Первая неделя - первая неделя года, которая содержит Четверг . Это означает, что это первая неделя с 4 или более днями в январе.
    • При таком определении можно иметь номер недели 53. Это происходит с первого января в пятницу (например, 2016-01-01, 2010-01-01). Или, если годом раньше был високосный год, тоже суббота. (Например, 2005-01-01)

         December 2015               January 2016        
       Mo Tu We Th Fr Sa Su CW    Mo Tu We Th Fr Sa Su CW
           1  2  3  4  5  6 49                 1  2  3 53
        7  8  9 10 11 12 13 50     4  5  6  7  8  9 10 01
       14 15 16 17 18 19 20 51    11 12 13 14 15 16 17 02
       21 22 23 24 25 26 27 52    18 19 20 21 22 23 24 03
       28 29 30 31          53    25 26 27 28 29 30 31 04
      

      Учитывая year, week_number и day_of_week, как мы можем восстановить дату? Ответ требует нескольких шагов и вычислит день года (doy) запрошенной даты.

      Чтобы вычислить день года doy, нам сначала нужно выяснить, когда начинается первая неделя, как объяснено выше. Если 01 января - вторник, то первая неделя содержит только 6 дней, а не 7, а если 01 января - пятница, первая неделя начинается только через неделю. Таким образом, мы можем решить это, добавив смещение. Смещение можно найти в следующей таблице:

      dow001 str: Mo Tu We Th Fr Sa Su
      dow001 num: 01 02 03 04 05 06 07
      offset    :  0 -1 -2 -3  3  2  1
      

      , и это смещение вычисляется как 3-(dow001+2)%7

      . Таким образом, день года очень легко вычисляется: [1123 ]

      doy = (week_number-1) * 7 + 3-(dow001+2)%7 + day_of_week
      

      Итак, имея это, мы можем написать следующий инструмент GNU awk:

      awk 'function compute_date(YYYY,CW,DOW) {
              dow001 = strftime("%u",mktime(YYYY " 01 01 00 00 00"))
              doy    =  (CW-1)*7 + (3 - (dow001+2)%7) + DOW
              return strftime("%Y%m%d",mktime(YYYY " 01 " doy " 00 00 00"))}
           }
           BEGIN { FS = OFS = "," }
           { datestr = compute_date(2000+$2,$3,$4) }
           { print $1, datestr , $5,$6,$7,$8,$9 }' file
      
      
      740054,20171002,0000000000001,25,25,test1,1
      740054,20171003,0000000000001,24,24,test2,1
      740054,20171005,0000000000001,19,19,test3,1
      
    0
    ответ дан kvantour 16 January 2019 в 11:31
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: