将日期转换为不同的时区+格式更改

将日期转换为不同的时区+格式更改

我有一个日志文件,其时间戳格式为“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错误或类似的东西。

相关内容