wget本地时区的文件时间戳

时间:2016-10-12 02:58:26

标签: timezone timestamp wget

我们使用wget从美国各地的不同供应商处下载数据文件。例如,我们的服务器在EST时区,vendeor1的时区是CST,而vendor2的时区是PST。

wget的默认行为是文件的最后修改时间戳仍将保留在源的原始时区中。我们如何在本地服务器(EST)时区获得lastmodified timestamp?

这是一个例子,file1是从位于加利福尼亚(PST / PDT)的vendor2服务器下载的。在创建时间之前,最后修改的时间是没有意义的。实际上次修改时间为星期四9月29日22:57:00 PDT 2016年,即2016年12月29日星期五1:57:00。

我们之所以看到"错误"最后修改时间是因为wget将时间保留在源的时区。如果我们使用wget从我们收到的基于我们收到的lastmodified的EST,PST和订单文件以外的服务器下载数据,那么它将是不正确的。有没有一种简单的方法来使用目标服务器'使用wget时的时区? (至少所有文件' lastmodified timestamp将处于相同的tiemzone,或者自epoch以来的unixtime)

file1 = '..../yyyymmdd.zip'
>>> os.path.getmtime(file1)
1475204220.0

>>> os.path.getctime(file1)
1475253907.1713214

$ date -d @1475204220
Thu Sep 29 22:57:00 EDT 2016

$ date -d @1475253907.1713214
Fri Sep 30 12:45:07 EDT 2016

不应该将lastmodified保存为timezone-less unix-style timestamp与文件关联?如果它是无时区的,那么无论服务器位于何处,或者文件传输到哪里都没关系(作为文件的创建时间戳。)那么为什么wget会修改它?

1 个答案:

答案 0 :(得分:1)

此bash脚本使用 wget 获取文件,使用相同名称将其写出,然后使用 Last-Modified 日期调整时间戳 curl 请求的标头。

#!/bin/bash

get_file() {
        echo 'Getting the file';
        `wget -q "$1" -O "$2"`;
        return $?
}

adjust_timestamp(){
        echo 'Adjusting the timestamp';
        FILEDATE=`curl -sI "$1" | grep Last-Modified`;
        if [ -z "$FILEDATE" ];
        then
                FILEDATE=`curl -sI "$1" | grep Date`;
        fi;
        FILEDATE=`echo "$FILEDATE" | sed "s/^[^:]\+: //"`;
        NEWDATE=`date --date="$FILEDATE"`;
        echo "File date from source server: $FILEDATE";
        ls -l $2;
        echo "Date adjusted for timezone: $NEWDATE";
        touch $2 -d "$NEWDATE";
        ls -l $2;
}

HOST='http://www.example.com';
FILE='robots.txt';
URL="$HOST/$FILE"

if get_file "$URL" "$FILE";
then
        adjust_timestamp "$URL" "$FILE";
fi;

示例输出

  

获取文件

     

调整时间戳

     

来自源服务器的文件日期:星期四,2007年12月27日02:47:13 GMT

     

-rw-RW-R--。 1位用户481年12月26日robots.txt

     

根据时区调整日期:12月26日星期三21:47:13 2007年

     

-rw-RW-R--。 1位用户481年12月26日robots.txt

这是两个(或三个)请求。您可能希望增强脚本以仅发出一个请求。