在 Mac OSX 上将 unix 纪元时间转换为人类可读的日期 - BSD

Posted

技术标签:

【中文标题】在 Mac OSX 上将 unix 纪元时间转换为人类可读的日期 - BSD【英文标题】:Convert unix epoch time to human readable date on Mac OSX - BSD 【发布时间】:2014-03-24 09:49:08 【问题描述】:

在我的 Mac OSX 上,我的 bash 脚本有一个纪元时间123439819723。我可以通过date -r 123439819723 将日期转换为人类可读的格式,这给了我Fri Aug 26 09:48:43 EST 5881

但我希望日期采用mm/ddd/yyyy:hh:mi:ss 格式。 date --date 选项在我的机器上不起作用。

【问题讨论】:

添加一个以“+”为前缀的参数来表示格式。 【参考方案1】:

给你:

# date -r 123439819723 '+%m/%d/%Y:%H:%M:%S'
08/26/5881:17:48:43

在 bash 脚本中你可以有这样的东西:

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
  dayOfWeek=$(date --date @1599032939 +"%A")
  dateString=$(date --date @1599032939 +"%m/%d/%Y:%H:%M:%S")
elif [[ "$OSTYPE" == "darwin"* ]]; then
  dayOfWeek=$(date -r 1599032939 +%A)
  dateString=$(date -r 1599032939 +%m/%d/%Y:%H:%M:%S)
fi

【讨论】:

5881 年?我喜欢你的乐观。我认为 123439819723 的数量更可能是指毫秒,而不是秒,所以你想要 date -r 123439819 '+%m/%d/%Y:%H:%M:%S' ,它给出了 11/29/1973:08:50:19【参考方案2】:

要使用 OS X date 转换 UNIX 纪元时间,请使用

date -j -f %s 123439819723

-j 阻止date 尝试设置系统时钟,-f 指定输入 格式。您可以添加+<whatever> 来设置输出 格式,与GNU date 一样。

【讨论】:

在 OSX 上,我必须将 unix 时间指定为最后一个参数:date -j -f %s 1374432952 FreeBSD 上也一样。 date -j -f %s 1374432952 工作。 这适用于 MacOS,但需要以秒为单位提供纪元时间(而不是毫秒 - 来自问题) 效果很好,谢谢!【参考方案3】:

来自命令外壳

[aks@APC ~]$ date -r 1474588800
Fri Sep 23 05:30:00 IST 2016

[aks@APC ~]$ date -ur 1474588800
Fri Sep 23 00:00:00 UTC 2016

[aks@APC ~]$ echo "1474588800" | xargs -I  date -jr  -u
Fri Sep 23 00:00:00 UTC 2016

【讨论】:

【参考方案4】:

在 Linux(使用 GNU coreutils 5.3+)的情况下,可以使用更少的击键来实现:

date -d @1608185188
#Wed Dec 16 22:06:28 PST 2020

在 Mac 上可能需要安装 coreutils (brew install coreutils)

【讨论】:

自 2022 年 1 月起不适用于 mac os。 @jamescampbell 你有 gnu coreutils 5.3+ 吗? ?以下是我运行上述命令时发生的情况:❯ date -d @1608185188 usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] 没有。你的答案是关于 Linux 的。 OP 提出的问题是关于 Mac OS / Unix 的。它们是有区别的。根据您对错误操作系统的回答,您似乎应该删除您的答案,并请再次查看 OP 发布的原始问题。我的评论是有效的,我的跟进是有效的。如果您想回答如何在 linux 上进行日期转换,请先找人问这个问题并在那里发布您的答案(或自己问)。否则,您将一个方形钉子强行插入一个圆孔并失败并浪费人们时间阅读您的无效答案。我试过了! 如果您可能多花 1 分钟,您会看到这篇文章 ***.com/a/9805125/1215344,它解释了 Unix / Linux 日期包的差异,是的,coreutils 将安装 gdate ,这与本机(Mac OS 附带)日期包完全不同。所以,你可以更新你的答案说,“如果你想添加一个包来让它在 Mac OS 上工作,你可以做 brew install coreutils 并让 gdate 具有与 Linux date 命令相同的功能。”这似乎可以接受。【参考方案5】:

在 Mac OS 上运行的组合解决方案。

外壳代码:

T=123439819723 
D=$(date -j -f %s  $(($T/1000)) '+%m/%d/%Y:%H:%M:%S').$(($T%1000))
echo "[$T] ==> [$D]"

输出:

[123439819723] ==> [11/29/1973:11:50:19.723]

或者一行:

> echo 123439819723 |  read T; D=$(date -j -f %s  $(($T/1000)) '+%m/%d/%Y:%H:%M:%S').$(($T%1000));  echo "[$T] ==> [$D]" 
[123439819723] ==> [11/29/1973:11:50:19.723]

【讨论】:

以上是关于在 Mac OSX 上将 unix 纪元时间转换为人类可读的日期 - BSD的主要内容,如果未能解决你的问题,请参考以下文章

将 UNIX 纪元转换为日期对象

在 Informix 中将 DATETIME 转换为 Unix 纪元

如何在 C 中将 10131520 转换为 Unix 纪元时间?

Perl 将本地时间转换为 unix(纪元)时间

如何在 kotlin 中将纪元时间戳转换为 unix 十六进制时间戳?

在 xslt 中将 dateTime 转换为 unix 纪元