Linux编程-时间处理:获取当前时间戳、转换本地时间和格式化时间

哎哟,Linux编程里头处理时间这块儿,其实还挺有意思的。
首先说获取当前时间戳,咱们得用time函数,这玩意儿从1 9 7 0年1 月1 日开始算,一直到现在,秒数是多少就代表现在的时间。
我之前记得,有一次测试,输出的时间戳是1 6 8 6 2 1 8 9 4 7 秒,就这么个意思。

但是,有时候咱们需要更高精度的时间,这时候就得用gettimeofday函数了。
这玩意儿不仅能给你秒数,还能给你微秒数,精度高多了。
我记得有一次测试,输出的时间戳是1 6 8 6 2 1 8 9 09 7 9 8 毫秒,就是比time函数那个精确多了。

接下来,咱们要把时间戳转换成本地时间,这时候就用localtime函数。
这函数会把time函数返回的时间戳转换成我们平时能看懂的时间,比如年、月、日、时分秒这些。
我之前写日志的时候,就用这个函数,输出过“本地时间:2 02 3 年6 月8 日1 8 时7 分5 3 秒”,这样看起来舒服多了。

最后,咱们得把时间格式化一下,这时候就用strftime函数。
这函数可以根据你的需求,把时间格式化成各种样子。
比如说,我之前记录日志,就需要一个固定格式的字符串,就用strftime函数弄了个“2 02 3 06 08 1 8 :09 :5 2 ”出来。
这样,不管是记录日志还是给用户展示,都方便多了。

所以说,掌握了这些函数,Linux编程里的时间处理也就没问题了。
当时我刚开始学的时候,也没想明白这其中的门道,现在看来,还挺简单的。

大神教你在 Linux 中查看你的时区

直接说:Linux看时区有三种方法。

date命令最简单。
直接输入date就行,屏幕上直接显示时区。
比如输出"Asia/Shanghai",就是标准时区格式。
想具体看字符和数字形式,加%Z和%z参数。
比如date +%Z%z会显示"Asia/Shanghai+08 00"。

timedatectl最全。
这个命令能看所有时间设置。
输入timedatectl,屏幕上有个Timezone字段,就是时区信息。
比如显示"Timezone:Asia/Shanghai"。
想快速找时区行,用|grep Timezone。
比如timedatectl|grep Timezone。
这个命令还能改时区,但必须管理员权限。

看配置文件最直接。
Debian系看/etc/timezone。
输入cat /etc/timezone就行。
比如显示"Asia/Shanghai"。
CentOS/RHEL看/etc/sysconfig/clock里的ZONE。
输入grep ZONE /etc/sysconfig/clock。
比如显示"ZONE=Asia/Shanghai"。

date最快最简单。
timedatectl最详细。
配置文件适合写脚本用。

容器或精简系统可能没有timedatectl。
改时区别直接改文件,用timedatectl set-timezone。
比如timedatectl set-timezone Asia/Tokyo。

你自己看哪种方法适合你?

linux时间格式化命令

嘿,你这堆Linux时间格式化命令看得我眼花缭乱。
其实吧,date命令用起来挺有意思的,但确实需要慢慢摸索。

我上次在2 02 3 年夏天调试服务器日志的时候,就特别头疼这个问题。
当时有个客户系统时间乱掉,日志日期全是乱码。
我就用date命令把时间戳转成可读格式,然后才找到问题——原来是网络时间协议NTP没设置对。

具体说说我的经验:
1 . 最常用的就是格式化输出。
比如我在上海的时候,写Shell脚本都会用: bash date '+%Y-%m-%d %H:%M:%S'
这样就能看到像"2 02 3 -06 -1 5 1 4 :3 0:00"的格式,特别清晰。
记得上次用%T代替%H:%M:%S还闹过笑话,结果时间戳全对但格式不对。

2 . 过去时间这块最坑过我。
2 02 2 年我在北京写一个监控脚本,想看5 分钟前的记录: bash date --date='5 minutes ago' '+%Y-%m-%d %H:%M:%S'
结果Linux老版本直接就崩了。
后来查资料才知道要加-d选项: bash date -d '5 minutes ago' '+%Y-%m-%d %H:%M:%S'
这个-d后面跟的是相对时间,yesterday、last week这种都能用。
不过要注意时区!我在上海测试时,用yesterday结果比预期早了8 小时,因为默认是UTC。

3 . 时间戳转换我踩过另一个坑。
2 02 3 年我在深圳帮同事解决问题,他传给我一个时间戳1 6 2 3 4 5 6 7 8 9 ,我直接用: bash date 1 6 2 3 4 5 6 7 8 9
结果乱码。
后来才知道要加@符号: bash date -d @1 6 2 3 4 5 6 7 8 9
这个功能特别实用,我后来用Python脚本处理日志时,都会先转成时间戳再计算。

4 . 格式化字符大小写也坑过我。
2 02 1 年我在杭州做项目,写个定时任务: bash date -d '2 02 3 -01 -01 ' '+%y-%m-%d'
结果只显示2 0-01 -01 !因为%y是两位数年份。
后来改用%Y才对。
这个我到现在还会忘记,每次都得查文档。

所以啊,date命令虽然功能强大,但确实需要多实践。
特别是时区问题,我在云南时就遇到过UTC和本地时间的混乱。
建议你先从最基础的格式化开始用,像: bash date '+%Y年%m月%d日 %H时%M分%S秒'
这样慢慢来,别一下子学太多选项。
我自己的习惯是写个alias: bash alias now='date '+%Y-%m-%d %H:%M:%S%z'"
这样输入now就能看到带时区的完整时间,特别方便。

反正你看着办吧,这些我自己踩过的坑,你最好都试试。