2017-02-03 133 views
0

我有一個包含兩列的表格:年份和日期。我想將它們隱蔽到日期(年,月,日)在bash中從年份和日期轉換爲日期

下面的命令似乎僅一年正確讀取,但今年不是一天:

date -j -f "%Y %j" "2005 241" +%F 
2005-02-03 

我使用bash的操作系統上十,有何建議?

解決方案

$ yyyy="2015"; doy="241"; echo $(date -jf %s $(($(date -jf "%F %T" "$yyyy-01-01 23:59:30" +%s) + ((10#$doy - 1)) * 86400)) +"%F %T") 
2015-08-29 23:59:30 
$ date -j 082923592015 +%j 
241 

所以基本上,我們採取定年及構造時間爲當年(即1月1)的第一天,並將其轉換爲秒。然後,我們添加自一年第一天以來的總秒數(謹慎在這裏!因爲計數指的是01年1月,我們必須減去一秒)。以秒錶示的結果總和最終轉換爲預期格式。

  • -j不設置日期
  • -f允許指定輸入格式
  • +允許自1970年來指定輸出格式
  • %S秒-01-01 00:00:00 UTC
  • %F日期格式與%Y-%m-%d相同
  • %T時間格式相同%H:%M:%S
  • 引用%j天年爲3位數字(例如,001 ... 366)
  • $(( ))設置算術語境
  • 10#。轉換爲數字,以避免在今年的一天,前導零的問題,爲10進制(例如,009,099)

回答

1

通過使用Mac OS日期,我已經成功地運行:

date -j -f %s $(($(date -j 0101012015 +%s)+241*86400)) +%F 
2015-08-30 

date -j -f %s $(date -j -f %F 2015-01-01 +%s+241*86400 | bc) +%F 
2015-08-30 

其中,通過使用GNU日期v8.13我我們E:

date -d "2005-1-1 +241 days" +%F 
2005-08-30 
+0

@Inian我已經添加在Mac的慶典 –

+0

@Hauri這樣做的方式:如果您在GNU 運行反向命令'日期-d 20150830 +%j' 答案是242,而不是因此,從01月1日開始計數的人需要減去一天 'date -d「2005-1-1 + 240天」+%F' 。 – AjanO

相關問題