如何将星期几和星期几转换为日期

时间:2019-01-15 09:45:48

标签: bash date awk

我有CVS文件,这些文件包含我要合并的三个独立列中的日期信息。我得到的信息是:

  • 两位数年份(字段2)
  • 周数(字段3)
  • 星期几(字段4)

如何将这3个数字转换为YYYYMMDD格式的正常日期格式?

我的输入文件如下:

740054,17,40,1,0000000000001,25,25,test1,1
740054,17,40,2,0000000000001,24,24,test2,1
740054,17,40,4,0000000000001,19,19,test3,1

我想要的预期输出是:

740054,20171002,0000000000001,25,25,test1,1
740054,20171003,0000000000001,24,24,test2,1
740054,20171005,0000000000001,19,19,test3,1

以第一行为例:2017年10月2日是2017年第40周的星期一(1)

有人知道如何进行这种转换吗?

1 个答案:

答案 0 :(得分:0)

我将假设您的星期数符合ISO 8601的定义(有关其他定义,请参见here)。 ISO 8601 standard已在世界范围内广泛使用:欧盟和其他大多数国家 欧洲国家,亚洲大部分地区和大洋洲

ISO 8601标准规定以下内容:

  • 一周7天
  • 一周的第一天是星期一
  • 第一周是一年中的第一周,其中包含 星期四。这意味着这是第一天,有4天或更长时间 一月。

使用此定义,可能有第53周。这些发生在1月1日是 星期五(例如2016年1月1日,2010年1月1日)。或者,如果前一年是 年,也是星期六。 (例如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

鉴于yearweek_numberday_of_week,我们如何重构日期?答案需要几个步骤,并将计算出所请求日期的年份(doy)。

要计算一年doy的一天,我们首先需要确定第一周的开始时间,如上所述。如果1月1日是星期二,则第一周仅包含6天而不是7天,而如果1月1日是星期五,则第一周仅在下一周开始。因此,我们可以通过添加偏移量来解决此问题。偏移量可以在下表中找到:

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

因此,很容易计算一年中的某天:

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