我有一个日志文件,其时间戳格式为“22.09.2016 08:22:54”(“+%Y:%m:%d %H:%M:%S”)。此时间戳采用 UTC 时区。
现在我必须使用 bash 脚本将此时间戳转换为欧洲/赫尔辛基时间戳。
我有这个脚本,可以根据我的需要进行转换。
#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "2015-05-20 18:05:02")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"
这工作正常,但日期“输入”格式(-d“2015-05-20 18:05:02”)与我的日志时间戳格式不同。
我想将这个脚本改成类似这样的内容..
#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"
其中 $1 可以是我的日志文件“22.09.2016 08:22:54”的原始日期格式(“+%Y:%m:%d %H:%M:%S”)。
我无法让它工作。有人可以帮我解决这个问题吗?谢谢
编辑:
我曾尝试过类似的东西以及许多其他组合。
#!/bin/sh
sec=$(TZ="UTC" date +'%s' "+%Y:%m:%d %H:%M:%S" -d "$1")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"
但他的结局是错误的......
date: extra operand ‘+%Y:%m:%d %H:%M:%S’
Try 'date --help' for more information.
date: invalid date ‘@’
答案1
看起来不像date
支持输入格式字符串。因此,您不能直接将字符串传递给 date。手册页指出它接受通常的格式,因此您的语言环境设置可能会影响这一点,但我对此不确定。
此外让我们看看您的脚本:
#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
$(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")
这里发生的事情是,您将参数转换$1
为 Linux 时间戳,然后再次将其转换为所需的字符串。一种可能的方法是重新格式化$1
字符串参数,以便将其与您的输入配合使用。
您可以使用合适的正则表达式来执行此示例sed
。请注意,您应该事先确保您有一个有效的字符串,并且任何格式更改都可能破坏这一点。
#!/bin/bash
intputdate=$(echo $1 | sed -re 's/([0-9]{2})\.([0-9]{2})\.([0-9]{4})/\3-\2-\1/')
sec=$(TZ="UTC" date +'%s' -d "$intputdate")
echo $(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")
编辑:没有错误的变量名称肯定会有所帮助。
答案2
这看起来更好一些,将新西兰时间转换为摩纳哥时间:
TZ="欧洲/摩纳哥" 日期 --date="TZ=\"太平洋/奥克兰\" 2017-10-11 00:51" +%Y-%m-%d\ %H:%M:%S
2017-10-10 13:51:00
#!/bin/bash
new_zealand_time="2017-10-12 00:56"
monaco_time=$(TZ="Europe/Monaco" date --date="TZ=\"Pacific/Auckland\" $new_zealand_time" +%Y-%m-%d\ %H:%M:%S)
echo "Time in Monaco: $monaco_time"
摩纳哥时间:2017-10-11 13:56:00
答案3
在 MacOS (10.14.3) 上运行良好,因为你可以通过-f
开关提供你的精确格式:
$ d1="22.09.2016 08:22:54"
$ sec=$(TZ="UTC" date -j -f "%d.%m.%Y %H:%M:%S" "$d1" "+%s")
1474532574
$ TZ="Europe/Helsinki" date -j -f "%s" "$sec" "+%Y:%m:%d %H:%M:%S"
2016:09:22 11:22:54
顺便说一句,您的日志格式是"+%d.%m.%Y %H:%M:%S"
,而不是"+%Y:%m:%d %H:%M:%S"
您在第二段代码片段后所述的格式,否则上面我的代码中定义的行sec
可能会引发illegal time format
错误或类似的东西。