【问题标题】:Send date in URL在 URL 中发送日期
【发布时间】:2011-06-08 07:19:15
【问题描述】:

我需要在 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/')

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

【问题讨论】:

  • d1=$(date +%Y-%m-%dT%H:%M:%S%z | sed -e 's/+/%2B/') 有什么问题?
  • 看到这个问题:URLEncode from a bash script
  • @konerak,它只需要'+'。如果它恰好是时区中的“-”,则不会被考虑在内。
  • 呃。然后d1=$(date +%Y-%m-%dT%H:%M:%S%z | sed -e 's/+/%2B/' | sed -e 's/-/%2D/')? :)
  • @mirod,实际上将“+”留在时区是行不通的。奇怪的是,日期中的“-”没有问题。

标签: perl bash shell sed


【解决方案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'

【讨论】:

  • 而 %F 是 %Y%%2D%m,所以可能是 "%F-%dT%T%z"?
【解决方案2】:
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/')

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2013-06-04
    相关资源
    最近更新 更多