ChatGPT解决这个技术问题 Extra ChatGPT

在 bash 脚本中创建时间戳变量

我正在尝试在 shell 脚本中创建一个时间戳变量,以使日志记录更容易一些。我想在脚本的开头创建变量,并在我发出 echo $timestamp 时让它打印出当前时间。事实证明这比我想象的要难。以下是我尝试过的一些事情:

timestamp="(date +"%T")" echo 打印出 (date +"%T")

timestamp="$(date +"%T")" echo 打印变量初始化的时间。

我尝试过的其他事情只是轻微的变化,并没有更好的效果。有谁知道如何完成我想要做的事情?

kerfile 入口点

d
dchakarov

如果要获取 unix 时间戳,则需要使用:

timestamp=$(date +%s)

%T 会给你时间;与 %H:%M:%S 相同(通过 http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/


但是这个变量只会保存变量启动时的值,对吗?
我想这会得到很多支持,因为它回答了问题的标题,但它没有回答问题主体:D OP 每次都希望获得不同的时间戳,而这将为整个脚本存储一个时间戳。
我来这里就是为了找这个。即从date 获取unix 时间戳的正确格式字符串。但是,我也赞成“正确”的答案。我不是在寻找那个,但它是对原始问题的更好答案,它对我也非常有用。
在添加 'shell` timestamp=$(shell date +%s) 后我工作得很好
A
Alishan Khan

为了获取当前时间戳而不是定义固定变量的时间,诀窍是使用函数而不是变量:

#!/bin/bash

# Define a timestamp function
timestamp() {
  date +"%T" # current time
}

# do something...
timestamp # print timestamp
# do something else...
timestamp # print another timestamp
# continue...

如果您不喜欢 %T 说明符给出的格式,您可以组合 date 接受的其他时间转换说明符。对于 GNU date,您可以在此处的官方文档中找到这些说明符的完整列表:https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers


根据您打算如何使用它,您仍然需要使用命令替换:echo "$(timestamp): something happened"
至于格式,这里有一组最常见的格式:zxq9.com/archives/795
对我来说,我想要date +"%Y-%m-%d_%H-%M-%S"
出于某种原因,这并没有给我时间戳,而是给了我当前时间,中间有“:”。
我认为很多人遇到这个问题是为了寻找一种生成 unix 时间戳的方法(就像我所拥有的那样),并发现 dchakarov 的答案更有用,即使这个答案更好地解决了提问者的问题。
N
Nam G VU
DATE=`date "+%Y%m%d"`

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too

+1 用于添加毫秒部分。这 echo $(date +"%Y-%m-%dT%T.%3N%z") 但是我无法让它在 Mac 终端中工作。如何在 Mac 中做同样的事情。谢谢
C
Caner

ISO 8601 格式 (2018-12-23T12:34:56) 比 UNIX 时间戳更具可读性。但是,在某些操作系统上,文件名中不能包含 :。因此,我建议改用这样的东西:

2018-12-23_12-34-56

您可以使用以下命令获取此格式的时间戳:

TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`

这是我看到许多应用程序使用的格式。另一个好处是,如果您的文件名以此开头,您可以按字母顺序对它们进行排序,并且它们将按日期排序。


TZ=UTC date +... 可以通过使用 UTC 时间戳使其更便携
合并@MichaelChirico 的评论并在末尾添加 Zulu 时间 (== UTC) Z;并修改 @Caner 以使用 T: TIMESTAMP="$(TZ=UTC date +%Y-%m-%dT%H_%M_%SZ)"
I
Instein

您可以参考下表根据需要生成时间戳:

        Format/result           |       Command              |          Output
--------------------------------+----------------------------+------------------------------
YYYY-MM-DD                      | date -I                    | $(date -I)
YYYY-MM-DD_hh:mm:ss             | date +%F_%T                | $(date +%F_%T)
YYYYMMDD_hhmmss                 | date +%Y%m%d_%H%M%S        | $(date +%Y%m%d_%H%M%S)
YYYYMMDD_hhmmss (UTC version)   | date --utc +%Y%m%d_%H%M%SZ | $(date --utc +%Y%m%d_%H%M%SZ)
YYYYMMDD_hhmmss (with local TZ) | date +%Y%m%d_%H%M%S%Z      | $(date +%Y%m%d_%H%M%S%Z)
YYYYMMSShhmmss                  | date +%Y%m%d%H%M%S         | $(date +%Y%m%d%H%M%S)
YYYYMMSShhmmssnnnnnnnnn         | date +%Y%m%d%H%M%S%N       | $(date +%Y%m%d%H%M%S%N)
YYMMDD_hhmmss                   | date +%y%m%d_%H%M%S        | $(date +%y%m%d_%H%M%S)
Seconds since UNIX epoch:       | date +%s                   | $(date +%s)
Nanoseconds only:               | date +%N                   | $(date +%N)
Nanoseconds since UNIX epoch:   | date +%s%N                 | $(date +%s%N)
ISO8601 UTC timestamp           | date --utc +%FT%TZ         | $(date --utc +%FT%TZ)
ISO8601 UTC timestamp + ms      | date --utc +%FT%T.%3NZ     | $(date --utc +%FT%T.%3NZ)
ISO8601 Local TZ timestamp      | date +%FT%T%Z              | $(date +%FT%T%Z)
YYYY-MM-DD (Short day)          | date +%F\(%a\)             | $(date +%F\(%a\))
YYYY-MM-DD (Long day)           | date +%F\(%A\)             | $(date +%F\(%A\))

我不必经常滚动浏览其他 11 个答案来找到最佳答案。 :)
C
Christoffer Nissen

对于我的欧洲同胞,尝试使用这个:

timestamp=$(date +%d-%m-%Y_%H-%M-%S)

将给出格式的格式:“15-02-2020_19-21-58”

您调用变量并获得这样的字符串表示

$timestamp

请考虑为您的代码使用代码符号。
或通用解决方案:date +%Y-%m-%d_%H-%M-%S - 感谢您的回答。
c
choroba

使用命令替换:

timestamp=$( date +%T )

这是我已经尝试过的,它只打印出变量初始化的时间。
@dan08:这就是变量的工作方式。如果您想要动态输出,请使用函数。
S
Sean Lin

我正在使用 ubuntu 14.04。

我系统中的正确方式应该是date +%s

date +%T 的输出类似于 12:25:25


L
Loïc

很多答案,但找不到我要找的东西:

date +"%s.%3N"

返回类似:1606297368.210


在 MacOS 上,内置的 date 不支持 %N 格式;见stackoverflow.com/a/33641565/1677912
是的,很多答案,其中大部分是错误的,因为人们显然没有阅读这个问题
这行得通,我想知道符号 N 的含义是什么
@JerryAn 纳秒也许。
A
Adam Katz

您可以使用

timestamp=`date --rfc-3339=seconds`

这以 2014-02-01 15:12:35-05:00 格式提供

反引号 (`) 字符将导致计算它们之间的内容并将结果包含在行中。 date --help 有其他选项。


至于它得到什么时间,这应该在包含在屏幕输出或旨在列出输出时间的日志文件之前立即执行。
由于输出中的空间,这不是时间戳的理想格式。请务必在使用中引用它“$timestamp”,否则您将获得该命令的两个参数。例如 touch $timestamp 将产生两个文件。
对于那些想要自定义删除空格的人,date --rfc-3339=... (大致?)等同于 date '+%F %T%:z',因此删除空格很简单(例如):date '+%F_%T%:z'
c
chepner

bash 的最新版本不需要调用外部程序 date

printf -v timestamp '%(%T)T'

%(...)T 使用相应的参数作为 UNIX 时间戳,并根据括号之间的 strftime 样式格式对其进行格式化。 -1 的一个参数对应于当前时间,当没有歧义时可以省略。


Z
Zombo
timestamp=$(awk 'BEGIN {srand(); print srand()}')

没有值的 srand 使用大多数 Awk 实现的当前时间戳。


fwiw,对性能感到好奇:以下打印相同:(1)awk '....'(如上所示); (2) date '+%s'; (3) printf '%(%s)T';按性能提高的顺序列出:在我的系统上,dateawk 快大约 2 倍; printfdate 快 50 倍以上比 awk 快 100 倍。
c
carloswm85

这比您要求的要多一些,因此您可以根据需要对其进行自定义。

我正在尝试在 shell 脚本中创建时间戳变量...

该脚本将允许您创建一个变量。虽然我不完全确定更改 shell 上下文时的可重用性。但它会完成这项工作。

function timestamp {
    TEXT="Date:"
    DATE=`date +%Y-%m-%d`
    TIME=`date +%H:%M:%S`
    ZONE=`date +"%Z %z"`
    echo $TEXT $DATE $TIME $ZONE
}

function fulldate {
  timevariable=$(timestamp)
  echo $timevariable
}

echo "- Output 1:"
timestamp
echo "- Output 2:"
fulldate
echo "- Output 3:"
echo $timevariable

输出:

- Output 1:
Date: 2021-08-12 23:28:08 UTC +0000
- Output 2:
Date: 2021-08-12 23:28:08 UTC +0000
- Output 3:
Date: 2021-08-12 23:28:08 UTC +0000

我已经在 GNU bash 版本 4.4.23(1)-release (x86_64-pc-msys) 上对此进行了测试


p
pamphlet

如果性能是一个问题,@chepner 的 answer 无疑是赢家。

稍微复杂一点,您还可以仅使用 bash 内置函数获得微秒或毫秒的粒度。下面是一个发出当前时间戳(包括毫秒)的函数示例:

timestamp() {
    IFS=. read S US <<<$EPOCHREALTIME # Read epoch seconds/microseconds
    MS=$((10#$US/1000)) # Convert to milliseconds (interpret in base-10, even with leading 0)
    printf '%(%F %T)T.%03i' $S $MS # Emit formatted timestamp
}

TS=$(timestamp) # Invoke function, assign to variable

请注意,可以调整 printf 格式以发出您喜欢的日期/时间格式。


T
ThomasHaz

以下将给出本地日期和时间 - 但是它确实需要互联网访问。根据记录的内容,这可能是有益的 - 监控和记录连接状态?

curl -i --silent https://google.com/ 2>&1 | grep date

date: Fri, 03 Jun 2022 17:39:19 GMT