Как сравнить две отметки времени?

https://stackoverflow.com/a/1323769/799204

Одним из альтернативных решений является использование awk:

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

find . -type d -name 'tmp_c*' -print0 | xargs -0 du -s | awk 'BEGIN { sum=0 } { sum+=$1 } END { print sum }'

вывод будет десятичным

2
07.07.2017, 10:20
3 ответа

Попробуйте это,

Время 2017-03-25 05:52:09.373941000можно преобразовать в первый формат 24MAR17:00:14:09и затем выполнить сравнение.

date_in="24MAR17:00:14:09"
date_out=`date +%d%b%y:%H:%M:%S -d "2017-03-25 05:52:09.373941000" |  tr '[:lower:]' '[:upper:]'`
[ $date_in == $date_out ] && echo "The dates match"
1
27.01.2020, 22:03

башраствор:

#!/bin/bash
d1='24MAR17:00:14:09'
d2='2017-03-25 05:52:09.373941000'

d1="$(sed -E 's/^([0-9]{2})([A-Z]{3})([0-9]{2}):/\1-\2-\3 /' <<< $d1)"

if [[ $(date -d "$d1") == $(date -d "$d2") ]]
then 
    echo "dates are equal"
else 
    echo "dates are unequal"
fi
1
27.01.2020, 22:03

Основная проблема заключается в разборе предоставленных строк. Дата команды принимает только некоторые форматы, а не все. Решение состоит в том, чтобы воспользоваться возможностью Busybox принимать даты (почти)в любом формате .

Д1

  1. Создайте строку формата, которая печатает дату в том же формате, что и предоставленный:

    $ date -u +'%d%b%y:%T'
    07Jul17:15:18:48
    
  2. Используйте эту строку, чтобы указать busybox date, как анализировать строку даты. Имейте в виду, что локальная TZ может изменить результат, используйте -u (UTC ), чтобы избежать ошибок, или убедитесь, что вы установили правильную TZ для анализируемой строки времени.

    $ d1='24MAR17:00:14:09'
    $ busybox date -u -D '%d%b%y:%T' -d "$d1"
    Fri Mar 24 00:14:09 UTC 2017
    
  3. Сделать дату busybox для печати значения в секундах (с начала эпохи):

    $ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s'
    1490314449
    

Д2

Вы можете повторить процедуру и для второй метки времени, но в этом случае строка понимается непосредственно по дате:

$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129

И дата busybox удаляет наносекунды(${d2%.*})(подробнее об этом позже):

$ busybox date -u -d "${d2%.*}" +'%s'
1490421129

Дифф.

Вы должны были зафиксировать приведенные выше результаты в двух переменных:

$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd2="$(date -u -d "$d2" +'%s')"

Затем вычислите разницу и сравните с нулем:

$ (( resd1-resd2 )) && echo "Dates are different" || echo "Dates are equal"
Dates are different

Или напрямую сравнивать строки (, а не значения):

$ [[ "$resd1" == "$resd2" ]] && echo "equal" || echo "different"
different

Наносекунды

Есть три проблемы, если вам нужно сравнить также наносекунды.

  1. Первое значение не содержит наносекунд. Во-первых, первая дата не имеет значения в наносекундах.
    Вы можете добавить 9 нулей:

    $ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
    $ resd1="$resd1""$(printf '%0*d' 9 0)"
    $ echo "$resd1"echo "$resd2 - $resd1"
    1490314449000000000
    

    Или (лучше )повторно -обрабатывать значение с датой:

    $ resd1="$(date -u -d "@$resd1" +'%s%N')"
    $ echo "$resd1"
    1490314449000000000
    
  2. Вторая дата имеет наносекунды. В этом случае вторая дата имеет формат, который дата может обрабатывать напрямую, но если бы она имела формат, требующий предварительной -обработки по дате busybox, нам нужно будет добавить наносекунды позже. Например:

    $ d2='2017-03-25 05:52:09.373941000'
    $ resd2="$(busybox date -u -D '%Y-%m-%d %T' -d "$d2" +'%s')${d2##*.}"
    $ echo "$resd2"
    1490421129373941000
    
  3. Кроме того, bash, который вы используете, должен иметь возможность обрабатывать 64-битные целые числа.
    Если да, рассчитайте разницу:

    $ echo "(( $resd2 - $resd1 ))"
    (( 1490421129373941000 - 1490314449000000000 ))
    
    $ echo "$(( $resd1 - $resd2 ))"
    106680373941000
    

    Что составляет чуть более 106 тысяч секунд (~29 часов):

    $ echo "$(( ($resd2 - $resd1)/10**9 ))"
    106680
    
1
27.01.2020, 22:03

Теги

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