Zan*_*nna 28 command-line bash scripts date text-processing
我想编写一个脚本或函数来告诉我从现在到将来的给定日期有多少天。我正在努力解决的是如何处理给定的日期并将其与当前日期进行比较......我正在想象这样的事情
read -p "enter the date in the format YYYY-MM-DD "
Run Code Online (Sandbox Code Playgroud)
然后我假设我有一个对 shell 没有意义的字符串,我必须做一些评估,比如...?? (这只是一个例子;我想bc
是需要的)
i=$(($(date +%Y)-${REPLY%%-*}))
j=$(($(date +%m)-${REPLY:5:2}))
k=$(($(date +%d)-${REPLY##*-}))
Run Code Online (Sandbox Code Playgroud)
然后我不知道如何处理这些数字......?
if $i > 1 then assign l=$((i*365)) and else what?? # what about leap years?
Using $j somehow assign m # confused before I've started
Using $k somehow assign n # just as bad
echo $((l+m+n))
Run Code Online (Sandbox Code Playgroud)
我肯定让自己太难了;可能有一个文本处理工具可以理解日期并可以比较它们。
我怎样才能做到这一点?
Jac*_*ijm 31
一般来说,如果我们首先将时间转换为 (Unix)纪元时间(从 1-1-1970 的秒数),那么计算时间是最容易的。在 python 中,我们有工具可以将时间转换为纪元时间,然后再转换为我们喜欢的任何日期格式。
我们可以简单地设置一个格式,例如:
pattern = "%Y-%m-%d"
Run Code Online (Sandbox Code Playgroud)
...并定义今天:
today = "2016-12-07"
Run Code Online (Sandbox Code Playgroud)
然后编写一个函数来完成这项工作:
def convert_toepoch(pattern, stamp):
return int(time.mktime(time.strptime(stamp, pattern)))
Run Code Online (Sandbox Code Playgroud)
然后输出:
nowepoch = convert_toepoch(pattern, today)
print(nowepoch)
> 1481065200
Run Code Online (Sandbox Code Playgroud)
...正如前面提到的,这是自 1-1-1970 以来的秒数
如果我们在今天和未来的日期都这样做,随后计算差异:
pattern = "%Y-%m-%d"
Run Code Online (Sandbox Code Playgroud)
输出将按日期计算,因为我们使用格式%Y-%m-%d
。在四舍五入秒将可能给出不正确的时间差,如果我们近24个小时的例子。
today = "2016-12-07"
Run Code Online (Sandbox Code Playgroud)
def convert_toepoch(pattern, stamp):
return int(time.mktime(time.strptime(stamp, pattern)))
Run Code Online (Sandbox Code Playgroud)
一个小小的应用程序。如果您经常使用它,请将其添加到快捷方式中。
剧本:
nowepoch = convert_toepoch(pattern, today)
print(nowepoch)
> 1481065200
Run Code Online (Sandbox Code Playgroud)
orangedays.py
运行:
python3 /path/to/orangedays.py
Run Code Online (Sandbox Code Playgroud)用于以下.desktop
文件上方的微型应用程序脚本:
#!/usr/bin/env python3
import time
# set our date pattern
pattern = "%Y-%m-%d"
def convert_toepoch(pattern, stamp):
return int(time.mktime(time.strptime(stamp, pattern)))
# automatically get today's date
today = time.strftime(pattern); future = "2016-12-28"
nowepoch = convert_toepoch(pattern, today)
future_epoch = convert_toepoch(pattern, future)
print(int((future_epoch - nowepoch)/86400))
Run Code Online (Sandbox Code Playgroud)
orangedays.desktop
在~/.local/share/applications
在行中
Exec=/path/to/orangedays.py
Run Code Online (Sandbox Code Playgroud)
设置脚本的实际路径...
Dig*_*uma 26
在GNUdate
工具是在这样的事情相当不错。它能够解析多种日期格式,然后以另一种格式输出。这里我们%s
用来输出自纪元以来的秒数。$now
从$future
86400 秒/天中减去并除以 86400 秒/天是一个简单的算术问题:
#!/bin/bash
read -p "enter the date in the format YYYY-MM-DD "
future=$(date -d "$REPLY" "+%s")
now=$(date "+%s")
echo "$(( ( $future / 86400 ) - ( $now / 86400 ) )) days"
Run Code Online (Sandbox Code Playgroud)
Nic*_*ito 10
您可以尝试在 中awk
使用该mktime
函数执行某些操作
awk '{print (mktime($0) - systime())/86400}'
Run Code Online (Sandbox Code Playgroud)
awk 期望以“YYYY MM DD HH MM SS”格式从标准输入读取日期,然后打印指定时间与当前时间之间的差值(以天为单位)。
mktime
简单地将时间(以指定格式)转换为参考时间(1970-01-01 00:00:00 UTC)的秒数;systime simple 以相同的格式指定当前时间。从另一个中减去一个,你会在几秒钟内得到它们相距多远。除以 86400 (24 * 60 * 60) 转换为天。
Anw*_*war 10
这是一个 Ruby 版本
require 'date'
puts "Enter a future date in format YYYY-MM-DD"
answer = gets.chomp
difference = (Date.parse(answer) - Date.today).numerator
puts difference > 1 ? "That day will come after #{difference} days" :
(difference < 0) ? "That day passed #{difference.abs} days ago" :
"Hey! That is today!"
Run Code Online (Sandbox Code Playgroud)
ruby ./day-difference.rb
下面给出了脚本的示例运行(假设您已将其另存为day-difference.rb
)
有一个未来的日期
$ ruby day-difference.rb
Enter a future date in format YYYY-MM-DD
2021-12-30
That day will come after 1848 days
Run Code Online (Sandbox Code Playgroud)
随着日期的过去
$ ruby day-difference.rb
Enter a future date in format YYYY-MM-DD
2007-11-12
That day passed 3314 days ago
Run Code Online (Sandbox Code Playgroud)
当过了今天的日期
$ ruby day-difference.rb
Enter a future date in format YYYY-MM-DD
2016-12-8
Hey! That is today!
Run Code Online (Sandbox Code Playgroud)
这是一个很好的网站来检查日期的差异http://www.timeanddate.com/date/duration.html
有一个dateutils
包非常方便处理日期。在此处阅读有关它的更多信息github:dateutils
安装它
sudo apt install dateutils
对于你的问题,简单地说,
dateutils.ddiff <start date> <end date> -f "%d days"
其中输出可以选择为秒、分钟、小时、天、周、月或年。它可以方便地用于输出可用于其他任务的脚本中。
例如,
dateutils.ddiff 2016-12-26 2017-05-12 -f "%m month and %d days"
4 month and 16 days
dateutils.ddiff 2016-12-26 2017-05-12 -f "%d days"
137 days
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5217 次 |
最近记录: |