返回从现在到给定日期的天数的脚本或函数

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)

在此处输入图片说明

...还有 Zenity 选项

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)

把它包起来

用于以下.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$future86400 秒/天中减去并除以 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


ank*_*540 6

有一个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)