在URL中发送日期

时间:2011-06-08 07:19:16

标签: perl bash shell sed

我需要在POST HTTP请求中发送日期(格式为2011-06-07T05:34:28 + 0200)。为了实现这一点,我需要分别用'%2B'或'%2D'来改变时区的'+'或' - '。在bash / sed one liner中执行此操作的最有效方法是什么?

以下只更改'+',因为只有一个'+'(时区中的一个)。

d1=$(date +%Y-%m-%dT%H:%M:%S%z) // -> 2011-06-07T05:34:28+0200
d2=$(echo $d1 | sed -e 's/+/%2B/')

如何在单个命令中仅在时区中更改“+”或“ - ”字符

2 个答案:

答案 0 :(得分:1)

在Perl中你可以试试这个:

perl -M'POSIX strftime' -l -e'%rep=( "+" => "%2B", "-" => "%2D"); $d= strftime( "%Y-%m-%dT%H:%M:%S%z", localtime()); $d=~s{([+-])}{$rep{$1}}g; print $d'

基本上捕获'+'或' - '并用适当的转义值替换它们。

然后进一步思考它,应该有一个模块来逃避你的URL。事实上,这就是URI :: Escape的作用,所以你去了:

perl -M'POSIX strftime' -MURI::Escape  -l -e'$d= strftime( "%Y%%2D%m-%dT%H:%M:%S%z", localtime()); print uri_escape $d'

我无法相信没有什么可以缩短可怕的"%Y%%2D%m-%dT%H:%M:%S%z" strftime格式。

更新:所以在采取了glenn jackman的评论并删除了额外的变量后,最终的单行将是:

perl -M'POSIX strftime' -MURI::Escape -E'say uri_escape strftime "%FT%T%z", localtime'

答案 1 :(得分:0)

d1=$(date +%Y-%m-%dT%H:%M:%S%z)
d2=$(echo $d1 | sed -e 's/+([0-1][0-9]00)/%2B\1/' | sed -e 's/-([0-1][0-9]00)/%2D\1/')