Сценарий или функция, чтобы вернуть сколько дней с этого момента до определенной даты

Следующие работали для меня:

#1: clean up
sudo apt-get purge ibus
sudo apt-get install ibus
#2: reinstall (1)
# Settings > Language support > Install/remove language > Chinese (trad/simp)
#3: reinstall (2)
sudo apt-get install bus-table ubuntu-desktop unity-control-center unity-control-center-signon webaccounts-extension-common xul-ext-webaccounts
1
задан 8 December 2016 в 02:00

5 ответов

Утилита GNU date довольно хороша в этом. Он способен анализировать большое разнообразие форматов дат, а затем выводить их в другом формате. Здесь мы используем %s для вывода количества секунд с эпохи. Тогда простое арифметическое вычесть $now из $future и делить на 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"
21
ответ дан 23 May 2018 в 03:32
  • 1
    кроме неправильного округления (кажется), это хорошо работает! Я чувствую себя глупо, сомневаясь в полномочиях GNU date :) Спасибо :) – Zanna 8 December 2016 в 11:12
  • 2
    @Zanna. Я думаю, что решение проблемы округления - просто целое - разделите обе метки времени на 86400, прежде чем принимать разницу. Но здесь может быть какая-то деталь. Также вы хотите, чтобы введенная дата была локальным или UTC? Если его UTC, добавьте параметр -u в date. – Digital Trauma 8 December 2016 в 21:57

Вот версия 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:

Ниже приведен пример запуска скрипта 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

С прошедшей датой

$ ruby day-difference.rb
Enter a future date in format YYYY-MM-DD
2007-11-12
That day passed 3314 days ago

Когда прошла сегодняшняя дата

$ ruby day-difference.rb
Enter a future date in format YYYY-MM-DD
2016-12-8
Hey! That is today!

Здесь хороший сайт для проверки различий даты http://www.timeanddate.com/date/duration.html

10
ответ дан 23 May 2018 в 03:32

Вы можете попробовать что-то сделать в awk, используя функцию mktime

awk '{print (mktime($0) - systime())/86400}'

awk ожидает, что дата будет считаться со стандартного ввода в формате «YYYY MM DD HH MM SS» и затем печатает разницу между временем, и текущее время в днях.

mktime просто преобразует время (в заданном формате) на количество секунд от начала отсчета времени (1970-01-01 00:00:00 UTC); systime simple указывает текущее время в том же формате. Вычтите один из другого, и вы получите, как далеко друг от друга они находятся за считанные секунды. Разделите на 86400 (24 * 60 * 60), чтобы конвертировать в дни.

9
ответ дан 23 May 2018 в 03:32
  • 1
    Nice, Есть, однако, одна проблема: я думаю, вы не хотите, чтобы количество дней было плавающим, тогда простое разделение на 86400 не будет работать, возможно округление, поскольку решение дает неверный вывод, если вы находитесь около 24 часов – Jacob Vlijm 8 December 2016 в 01:33
  • 2
    Примечание. Функции времени Awk не являются POSIX – Steven Penny 8 December 2016 в 16:49

Существует пакет 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
3
ответ дан 23 May 2018 в 03:32

Вы можете использовать библиотеку awk Velor:

$ velour -n 'print (tm_date("2018-2-24") - tm_now()) / tm_day(1)'
6.27057

Или:

$ velour -n 'print (tm_date(ARGV[1]) - tm_now()) / tm_day(1)' 2018-2-24
6.27057
3
ответ дан 23 May 2018 в 03:32

Другие вопросы по тегам:

Похожие вопросы: