获取本地时区的文件时间戳



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

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

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

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

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

最后修改不应该保存为与文件关联的无时区unix风格时间戳吗?如果它是无时区的,那么服务器位于哪里,或者文件传输到哪里或从哪里传输都无关紧要(作为文件的创建时间戳)。那为什么wget要修改它呢?

这个bash脚本使用wget获取文件,以相同的名称将其写出来,然后使用Last-ModifiedDate头(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;

获取文件

调整时间戳

文件日期来自源服务器:Thu, 27 Dec 2007 02:47:13 GMT

-rw-rw-r——1 user user 481 Dec 26 2007 robots.txt

时区调整日期:Wed Dec 26 21:47:13 EST 2007

-rw-rw-r——1 user user 481 Dec 26 2007 robots.txt

发出两个(或三个)请求。您可能希望增强脚本,使其只发出一个请求。

相关内容

  • 没有找到相关文章