Кто-нибудь знает, почему «до» включает дату окончания?

Кто-нибудь знает, почему before включает дату окончания?

Дата 2021-07-01 14:13 на самом деле позже 2021-07-01

введите здесь описание изображения

Почему результаты неверны?

версия git 2.32.0


person Eugen Konkov    schedule 02.07.2021    source источник
comment
Учитывая, что --before и --until являются синонимами, и имеет смысл включать --until, я склоняюсь к плохо документированному, а не к глючному. (Можно также снисходительно возразить, что 2021-07-21 — это сокращение от 021-07-21 23:59:59.)   -  person chepner    schedule 02.07.2021
comment
Возможно, документация нуждается в некотором обновлении. Другие также прокомментировали это.   -  person TTT    schedule 02.07.2021
comment
Программисты, как известно, плохо понимают или придерживаются обычных концепций и ожиданий, поэтому программисты не должны создавать пользовательские интерфейсы. Сюда входят команды командной строки, параметры и аргументы. Только программист может разработать правдоподобное объяснение того, почему до определенной даты также включает эту дату.   -  person Lasse V. Karlsen    schedule 02.07.2021


Ответы (2)


Обратите внимание, что фильтры даты используют дату и время фиксации, а не дату и время автора.

Хотя это не задокументировано, как указано в ответе jthill и подтверждено моим ограниченным тестированием, неожиданно оказывается, что все фильтры даты, когда время не указано, относятся к текущему времени дня на вашем клиентском компьютере! Обратите внимание, что вы можете указать время, если хотите переопределить это:

git log --before=2021-07-02T23:59:59 (конец дня)

or

git log --before=2021-07-02T00:00:00 (начало дня)

Ниже мой тестовый скрипт. Он создает новое репо с одним пустым коммитом с датой фиксации от 2 дней назад минус 1 минута. (Так что через 1 минуту фиксация будет ровно 2 дня назад.) Затем скрипт зацикливается на минуту и ​​каждые 10 секунд выводит текущее время, а также журнал с использованием параметров --before и --after. Сначала --before ничего не показывает, а --after показывает фиксацию, но через минуту логи переворачиваются, как только текущее время превосходит дату фиксации:

#!/bin/bash

# create a test repo
git init
echo ""

# create a date which is 2 days ago minus 1 minute
var1=$(date --date '-2879 min')
# create a date that is the first date in only YYYY-MM-DD format
var2=$(date -d "$var1" +%F)
# show the variables
echo "var1=$var1"
echo "var2=$var2"
echo ""

# create an empty commit with a committer date set to 2 days ago minus 1 minute
GIT_COMMITTER_DATE=$var1 git commit --allow-empty -m 'Create an empty commit'

# display the log; there should only be 1 commit
git log --pretty=fuller
echo ""

# Every 10 seconds for 70 seconds, display the log before 2 days ago without a time specified.
# As soon as the current time passes the time of the commiter_date on the commit, the log will show.
for (( x=1; x<=8; x++ ))
do  
    echo "Current time: $(date)"
    echo "Output of: 'git log --before=$var2':"
    git log --before=$var2
    echo ""
    echo "Output of: 'git log --after=$var2':"
    git log --after=$var2
    echo ""
    sleep 10
done
person TTT    schedule 02.07.2021
comment
Все еще плохо документировано. Это не то, как работают даты или что-либо еще, что имеет последовательный упорядоченный порядок. Прежде чем X не включает X, поскольку этого никто не ожидает. - person Lasse V. Karlsen; 02.07.2021
comment
Проблема не столько в том, что раньше, сколько в использовании нестандартного расширения 2021-07-02, чтобы быть концом дня, а не началом (я думаю, что это гораздо более распространенная интерпретация). - person chepner; 02.07.2021
comment
Нет, интерпретация в конце дня — это именно то, чем занимаются программисты. Для всех остальных 2021-07-02 — это дата, а не время этой даты. До 2 февраля не означает любое время 2 февраля или раньше, это действительно означает раньше. 1 февраля — это раньше, 12 часов 2 февраля — это сравнение яблок и апельсинов, одно — дата, другое — время суток на дате, и если спросить любого непрограммиста, 12 часов 2 февраля — это до 2 февраля, вы либо получите отказ, либо наклоните голову, спросив, о чем вы на самом деле спрашиваете прямо сейчас. - person Lasse V. Karlsen; 02.07.2021
comment
@LasseV.Karlsen, поскольку я тестировал в конце дня, я ошибочно пришел к выводу, что время было в конце дня. ИМХО, недавно обновленный ответ - еще худшая новость, поскольку каждый раз, когда вы его запускаете, вы можете получить другой результат! Кроме того, пожалуйста, проголосуйте за ответ jthill, так как он обнаружил его раньше меня. - person TTT; 03.07.2021
comment
@chepner, пожалуйста, смотрите мой предыдущий комментарий. - person TTT; 03.07.2021
comment
@LasseV.Karlsen: вы совершенно правы. Но обратите внимание, что после 2 февраля явно означает 3 февраля и позже, а не, например, 23:59:59 2 февраля. Тем не менее, если вы спросите того же человека, включает ли после 2 февраля на 2 февраля, вы, вероятно, получите положительный ответ, при условии, что вы поставите перед вопросом единицу о том, что именно было до 2 февраля значит. Люди просто непоследовательны. - person torek; 03.07.2021

Если вы не укажете время отключения, будут использоваться текущие настенные часы, поэтому --before=yesterday, заданный в 17:00, означает, что до 17:00 вчера. Если вы хотите указать полночь, добавьте T00:00, --before=yesterday.T00:00. У меня это достаточно удивительно, чтобы считаться полноценной бородавкой, как и поведение find с размерами. К сожалению, это используется основными командами, так называемой сантехникой, и Git явно пообещал сценаристам, что их поведение и поэтому эта бородавка синтаксического анализа даты не изменится.

редактировать: попробуйте это:

unset head; for h in {0..23}; do
    head=$( GIT_COMMITTER_DATE=`date -d yesterday\ T$h:00` \
                    git commit-tree ${head+-p $head} -m - @: )
done

git log -1 --pretty=fuller $head
git log -1 --pretty=fuller --before=yesterday $head

и вы увидите, что before=yesterday выбирает тот, у которого отметка времени фиксации предшествует текущим настенным часам.

person jthill    schedule 02.07.2021