Как Git разобрать строку даты? - PullRequest
3 голосов
/ 13 апреля 2020

У меня есть строка даты из Joda DateTime.toString, которая выглядит следующим образом:

2020-04-03T12:43:55.019-04:00"

Если я сделаю

git commit --date="2020-04-03T12:43:55.019-04:00”

а затем git log, чтобы проверить дату, возвращается Sun Apr 19 12:43:55 2020 -0400, что кажется неправильным в части даты.

Но если я немного изменю часовой пояс с 04:00 до 05:00, Git похоже, что разбирает дату штрафа:

git commit --date="2020-04-03T12:43:55.019-05:00”

даст мне правильное время даты, когда я запускаю команду git log: Fri Apr 3 12:43:55 2020 -0500

Что такое не так с первым свиданием? Почему Git думает, что это 19 апреля, а не 3 апреля?

Ответы [ 3 ]

2 голосов
/ 14 апреля 2020

Я думаю, что вы нашли ошибку.

git-commit утверждает, что понимает эти форматы, но пытается понять намного больше.

   The GIT_AUTHOR_DATE, GIT_COMMITTER_DATE environment variables and the --date option
   support the following date formats:

   Git internal format
       It is <unix timestamp> <time zone offset>, where <unix timestamp> is the number
       of seconds since the UNIX epoch.  <time zone offset> is a positive or negative
       offset from UTC. For example CET (which is 1 hour ahead of UTC) is +0100.

   RFC 2822
       The standard email format as described by RFC 2822, for example Thu, 07 Apr
       2005 22:13:13 +0200.

   ISO 8601
       Time and date specified by the ISO 8601 standard, for example
       2005-04-07T22:13:13. The parser accepts a space instead of the T character as
       well.

           Note
           In addition, the date part is accepted in the following formats:
           YYYY.MM.DD, MM/DD/YYYY and DD.MM.YYYY.

2020-04-03T12:43:55.019-04:00 является совершенно действительным ISO 8601 datetime в формате ГГГГ-ММ-ДДЧч: мм: сс.ссс ± чч: мм. Он должен работать. Например, здесь Ruby на Rails.

[1] pry(main)> Time.parse("2020-04-03T12:43:55.21-04:00")
=> 2020-04-03 12:43:55 -0400

Git, кажется, перепутал дробные секунды и использует их как день месяца. И да, в часовом поясе -04: 00 тоже есть что-то особенное.

  • git commit --date='2020-04-03T12:43:55.021-04:00' -> Вт 21 апреля 12:43:55 2020 -0700 (с долями секунды, Смещение 0400, неверно)
  • git commit --date='2020-04-03T12:43:55-04:00' -> пт 3 апреля 12:43:55 2020 -0400 (без дробных секунд, смещение 0400, правильно)
  • git commit --date='2020-04-03T12:43:55.021-05:00' -> пт апр 3 12:43:55 2020 -0500 (доли секунды, смещение 0500, правильное значение)
  • git commit --date='2020-04-03T12:43:22.023-04:00' -> чт. 23 апреля 12:43:22 2020 -0700 (доли секунды, неверное значение)
  • git commit --date='2020-04-03T12:43:22.024-04:00' -> пт. 3 апреля 12:43:22 2020 -0400 (правильно)

Я думаю, что-то в Git ad ho c синтаксический анализ читает "21 -04 "как дата 21 апреля. Например.

  • git commit --date='12:43:22 23-04' -> Четверг 23 апреля 12:43:22 2020 -0700

Почему оно отключается 23 апреля У меня нет идея.

Вероятно, обрывается в 23, потому что нет 24 часа.

Ошибка, вероятно, match_multi_number в дате. c.

0 голосов
/ 09 мая 2020

Git, похоже, путает дробные секунды и использует их как день месяца

Ошибка, упомянутая и исправленная Schwern в их ответ начинает фиксироваться с Git 2.27 (Q2 2020), где approxidate синтаксический анализатор учится анализировать секунды с дробью .

См. commit 544ed96 , коммит b784840 , коммит 4f89f4f (24 апреля 2020 года) и коммит c933b28 (23 апреля 2020 года) Сон Трон Конг Данх (` `) .
(Объединено с Junio ​​C Hamano - gitster - в commit cdfa156 , 05 мая 2020)

date.c: пропустить дробную вторую часть ISO-8601

Автор: Брайан М. Карлсон
При поддержке: Junio ​​C Hamano
Подписано: ầoàn Trần Công Danh

git -commit (1) говорит ISO -8601 - один из наших поддерживаемых форматов даты.

ISO-8601 позволяет использовать временную метку мпс, чтобы иметь дробное количество секунд. Мы представляем время только в виде целых секунд, поэтому мы никогда не удосужились проанализировать дробные секунды.
Однако для нас лучше разобрать и отбросить дробную часть, чем вообще отказаться от анализа метки времени.

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

2008-02-14 20:30:45.019-04:00

При этом убедитесь, что мы интерпретируем число только после второй и Точка дробная, когда и только когда дата известна, поскольку только ISO-8601 допускает дробную часть, и мы научили наших пользователей интерпретировать «12:34:56.7.days.ago» как способ указания времени относительно текущего времени.

0 голосов
/ 14 апреля 2020

Его разбор ad-ho c, и он, безусловно, мог бы лучше обработать этот ввод (или просто отклонить его), но ваши времена плохо сформированы. Смещения TZ не имеют двоеточий.

git commit --date=2020-04-03T12:43:55.019-0400    # <-- `-0400`, not `-04:00`.

работает.

edit: я вижу, что правила ISO для отметок времени допускают : в смещении, где правила RF C 822 нет, это, вероятно, источник путаницы здесь.

Почему-то я просто не могу достаточно над этим поработать, чтобы приготовить патч.

...