--date / -d 选项是 date 命令最强大的功能之一,它可以解析和理解非常自然的日期时间描述,使时间计算和转换变得简单。
date --date="datestr"# 或简写date -d "datestr"
此选项用于显示指定的日期和时间,而不是当前系统时间。
datestr 的详细输入格式可参见 Date-input-formats[1]。
通过下面这些例子可知晓个大概。
# 常见的日期输入格式date -d "2026-01-12 15:30:45"date -d "2026-01-12T15:30:45+08:00"date -d "01/12/2026 3:30:45 PM"date -d "Jan 12, 2026 15:30:45"# 默认输出Mon Jan 12 15:30:45 CST 2026Mon Jan 12 15:30:45 CST 2026Mon Jan 12 15:30:45 CST 2026Mon Jan 12 15:30:45 CST 2026
指定输出格式:
# 常见的日期输入格式date '+%F %T' -d "2026-01-12 15:30:45"date '+%F %T' -d "2026-01-12T15:30:45+08:00"date '+%F %T' -d "01/12/2026 3:30:45 PM"date '+%F %T' -d "Jan 12, 2026 15:30:45"# 按格式输出2026-01-12 15:30:452026-01-12 15:30:452026-01-12 15:30:452026-01-12 15:30:45
还可以用英文单词来描述相对时间。
date '+%F %T'# 2026-01-12 15:46:39 现在date '+%F %T' -d "tomorrow"# 2026-01-13 15:46:39 明天date '+%F %T' -d "yesterday"# 2026-01-11 15:46:39 昨天date '+%F %T' -d "now"# 2026-01-12 15:46:39 当前时间date '+%F %T' -d "today"# 2026-01-12 15:46:39 今天date '+%F %T' -d "next Monday"# 2026-01-19 00:00:00 下周一date '+%F %T' -d "last Friday"# 2026-01-09 00:00:00 上周五date '+%F %T' -d "next week"# 2026-01-19 15:46:39 下周date '+%F %T' -d "2 days ago"# 2026-01-10 15:46:39 2天前
date '+%F %T'# 2026-01-12 15:51:15 现在date '+%F %T' -d "next hour"# 2026-01-12 16:51:15 1小时后date '+%F %T' -d "2 hours"# 2026-01-12 17:51:15 2小时后date '+%F %T' -d "5 minutes"# 2026-01-12 15:56:15 5分钟后date '+%F %T' -d "1 month"# 2026-02-12 15:51:15 1个月后date '+%F %T' -d "1 year"# 2027-01-12 15:51:15 1年后
# 复杂组合date '+%F %T'# 2026-01-12 15:56:59 现在date '+%F %T' -d "next Monday 2 hours ago"# 2026-01-18 22:00:00date '+%F %T' -d "yesterday 3:30 PM"# 2026-01-11 15:30:00date '+%F %T' -d "tomorrow 9:00 AM + 2 hours"# 2026-01-13 11:00:00
# 计算时间date '+%F %T'# 2026-01-12 16:00:51date '+%F %T' -d "now + 3 days"# 2026-01-15 16:00:51date '+%F %T' -d "2026-01-31 - 7 days"# 2026-01-24 00:00:00date '+%F %T' -d "2026-01-31 - 1 seconds"# 2026-01-30 23:59:59# 计算时间差start=$(date -d "2026-01-01" +%s)end=$(date -d "2026-01-10" +%s)days=$(((end - start) / 86400))echo"相差 $days 天"# 相差 9 天
下面是笔者常用,懂的都懂。统计周期就靠它们了。
date_time=`date '+%Y-%m-%d %H:%M:%S'`the_day_before_yesterday=`date -d '-2 day''+%Y-%m-%d'`yesterday=`date -d '-1 day''+%Y-%m-%d'`today=`date '+%Y-%m-%d'`tomorrow=`date -d '1 day''+%Y-%m-%d'`yesterday_month=`date -d '-1 day''+%Y-%m'`last_month=`date -d "$(date '+%Y-%m-01') -1 day"'+%Y-%m'`today_month=`date '+%Y-%m'`this_month=`date '+%Y-%m'`the_last_day_of_last_month=`date -d "$(date '+%Y-%m-01') -1 day"'+%Y-%m-%d'`the_first_day_of_next_month=`date -d "$(date '+%Y-%m-01') next month"'+%Y-%m-%d'`the_first_day_of_month=`date '+%Y-%m-01'`yesterday_month=`date -d '-1 day''+%Y-%m'`yesterday_last_month=`date -d "$(date -d '-1 day' +%Y%m)01 last month" +%Y-%m`yesterday_the_first_day_of_month=`date -d '-1 day''+%Y-%m-01'`yesterday_the_first_day_of_next_month=`date -d "$(date -d '-1 day' '+%Y%m')01 next month"'+%Y-%m-%d'`yesterday_the_last_day_of_last_month=`date -d "$(date -d '-1 day' '+%Y%m')01 -1 day"'+%Y-%m-%d'`the_day_7_day_ago=`date -d "-7 day"'+%Y-%m-%d'`the_day_30_day_ago=`date -d "-30 day"'+%Y-%m-%d'`the_day_60_day_ago=`date -d "-60 day"'+%Y-%m-%d'`the_day_90_day_ago=`date -d "-90 day"'+%Y-%m-%d'`your_date=`date -d '-1 day -1 year 2021-10-21''+%Y-%m-%d'`last_month_first_day=date -d "$(date +%Y%m)01 last month"'+%Y-%m-%d'next_month_first_day=date -d "$(date +%Y%m)01 next month"'+%Y-%m-%d'
可以另存为下面的脚本获得更直观的结果。
#!/bin/bash# 获取当前日期时间date_time=`date '+%Y-%m-%d %H:%M:%S'`echo"date_time: $date_time"# 前天的日期the_day_before_yesterday=`date -d '-2 day''+%Y-%m-%d'`echo"the_day_before_yesterday: $the_day_before_yesterday"# 昨天的日期yesterday=`date -d '-1 day''+%Y-%m-%d'`echo"yesterday: $yesterday"# 今天的日期today=`date '+%Y-%m-%d'`echo"today: $today"# 明天的日期tomorrow=`date -d '1 day''+%Y-%m-%d'`echo"tomorrow: $tomorrow"# 昨天所在的月份yesterday_month=`date -d '-1 day''+%Y-%m'`echo"yesterday_month: $yesterday_month"# 上个月份last_month=`date -d "$(date '+%Y-%m-01') -1 day"'+%Y-%m'`echo"last_month: $last_month"# 今天所在的月份today_month=`date '+%Y-%m'`echo"today_month: $today_month"# 本月(与today_month相同)this_month=`date '+%Y-%m'`echo"this_month: $this_month"# 上个月的最后一天the_last_day_of_last_month=`date -d "$(date '+%Y-%m-01') -1 day"'+%Y-%m-%d'`echo"the_last_day_of_last_month: $the_last_day_of_last_month"# 下个月的第一天the_first_day_of_next_month=`date -d "$(date '+%Y-%m-01') next month"'+%Y-%m-%d'`echo"the_first_day_of_next_month: $the_first_day_of_next_month"# 本月的第一天the_first_day_of_month=`date '+%Y-%m-01'`echo"the_first_day_of_month: $the_first_day_of_month"# 昨天所在的月份(与前面的yesterday_month重复)yesterday_month=`date -d '-1 day''+%Y-%m'`echo"yesterday_month (redefined): $yesterday_month"# 昨天所在月份的上个月份yesterday_last_month=`date -d "$(date -d '-1 day' +%Y%m)01 last month" +%Y-%m`echo"yesterday_last_month: $yesterday_last_month"# 昨天所在月份的第一天yesterday_the_first_day_of_month=`date -d '-1 day''+%Y-%m-01'`echo"yesterday_the_first_day_of_month: $yesterday_the_first_day_of_month"# 昨天所在月份的下个月的第一天yesterday_the_first_day_of_next_month=`date -d "$(date -d '-1 day' '+%Y%m')01 next month"'+%Y-%m-%d'`echo"yesterday_the_first_day_of_next_month: $yesterday_the_first_day_of_next_month"# 昨天所在月份的上个月的最后一天yesterday_the_last_day_of_last_month=`date -d "$(date -d '-1 day' '+%Y%m')01 -1 day"'+%Y-%m-%d'`echo"yesterday_the_last_day_of_last_month: $yesterday_the_last_day_of_last_month"# 7天前的日期the_day_7_day_ago=`date -d "-7 day"'+%Y-%m-%d'`echo"the_day_7_day_ago: $the_day_7_day_ago"# 30天前的日期the_day_30_day_ago=`date -d "-30 day"'+%Y-%m-%d'`echo"the_day_30_day_ago: $the_day_30_day_ago"# 60天前的日期the_day_60_day_ago=`date -d "-60 day"'+%Y-%m-%d'`echo"the_day_60_day_ago: $the_day_60_day_ago"# 90天前的日期the_day_90_day_ago=`date -d "-90 day"'+%Y-%m-%d'`echo"the_day_90_day_ago: $the_day_90_day_ago"# 基于2021-10-21计算的日期(向前推1天和1年)your_date=`date -d '-1 day -1 year 2021-10-21''+%Y-%m-%d'`echo"your_date: $your_date"# 上个月的第一天last_month_first_day=`date -d "$(date +%Y%m)01 last month"'+%Y-%m-%d'`echo"last_month_first_day: $last_month_first_day"# 下个月的第一天next_month_first_day=`date -d "$(date +%Y%m)01 next month"'+%Y-%m-%d'`echo"next_month_first_day: $next_month_first_day"
示例输出:
date_time : 2026-01-12 16:27:29the_day_before_yesterday : 2026-01-10yesterday : 2026-01-11today : 2026-01-12tomorrow : 2026-01-13yesterday_month : 2026-01last_month : 2025-12today_month : 2026-01this_month : 2026-01the_last_day_of_last_month : 2025-12-31the_first_day_of_next_month : 2026-02-01the_first_day_of_month : 2026-01-01yesterday_month(redefined) : 2026-01yesterday_last_month : 2025-12yesterday_the_first_day_of_month : 2026-01-01yesterday_the_first_day_of_next_month : 2026-02-01yesterday_the_last_day_of_last_month : 2025-12-31the_day_7_day_ago : 2026-01-05the_day_30_day_ago : 2025-12-13the_day_60_day_ago : 2025-11-13the_day_90_day_ago : 2025-10-14your_date : 2020-10-20last_month_first_day : 2025-12-01next_month_first_day : 2026-02-01
参考资料
[1] Date-input-formats: https://www.gnu.org/software/coreutils/manual/html_node/Date-input-formats.html