2012-03-19 159 views
2

有人能帮我理解为什么我在下面的代码中得到由mktime返回的“-1”。谢谢。awk:mktime返回-1

#!/usr/local/bin/bash 
f_name="crap.stat" 
S_Date="2012-02-10" 
E_Date="2012-02-13" 

gawk -F '\t' -v s_date="$S_Date" -v e_date="$E_Date" 'BEGIN {s_time = mktime(s_date);e_time = mktime(e_date);print s_time, e_time}' $f_name 

回答

4

您必须使用该功能的特定格式。下面的代码固定:

#!/usr/local/bin/bash 
f_name="crap.stat" 
S_Date="2012-02-10" 
E_Date="2012-02-13" 

gawk -F '\t' -v s_date="$S_Date" -v e_date="$E_Date" ' 
    BEGIN { 
    gsub(/-/, " ", s_date); 
    s_date = s_date " " 00 " " 00 " " 00; 
    s_time = mktime(s_date); 
    gsub(/-/, " ", e_date); 
    e_date = e_date " " 00 " " 00 " " 00; 
    e_time = mktime(e_date); 
    print s_time, e_time 
    } 
' $f_name 

结果:

1328828400 1329087600 

它必须是未来的格式:YYYY MM DD HH MM SS[ DST],所以我用空格代替-和追加零的时间。

+0

我的数据文件的格式为$ Date $ val和$ Date的格式为“yyyy-mm-dd”,所以我需要mktime以该格式生成日期进行比较 – 2012-03-19 15:31:07

+0

谢谢,即使没有使用mktime,奇怪? – 2012-03-19 15:41:28

+0

@ShuvoShams:像ISO8601一样(ISO8601也有时区的东西)的一个优点是字符串比较工作...(因为它是从最重要到最不重要的)(字符串比较需要使用前导零工作虽然) – 2015-06-01 09:33:44