* [PATCH] doc: document and test `@` prefix for raw timestamps
@ 2026-06-01 21:39 Luna Schwalbe
2026-06-02 0:23 ` Junio C Hamano
0 siblings, 1 reply; 5+ messages in thread
From: Luna Schwalbe @ 2026-06-01 21:39 UTC (permalink / raw)
To: git; +Cc: Luna Schwalbe, Junio C Hamano
The Git internal date format `<unix-timestamp> <time-zone-offset>`
fails to parse when the timestamp is less than 100,000,000 (fewer than
9 digits). This happens to avoid potential ambiguity with other date
formats such as `YYYYMMDD`, especially when used with approxidate.
To force the parser to interpret the value as a raw timestamp, it must
be prefixed with `@` (e.g., `@0 +0000`). This behavior was introduced
in 2c733fb24c10a9d7aacc51f956bf9b7881980870 (parse_date(): '@' prefix
forces git-timestamp, 2012-02-02) but was never documented.
Document the `@` prefix in `Documentation/date-formats.adoc` to make
this behavior explicit. Also add test cases to `t/t0006-date.sh` to
verify and demonstrate the difference between prefixed and unprefixed
small timestamps (e.g., `@2000` vs `2000`).
Signed-off-by: Luna Schwalbe <dev@luna.gl>
Co-authored-by: Junio C Hamano <gitster@pobox.com>
---
I switched out the YYYYMMDD tests as that format doesn't appear to be
understood by either parse or approxidate.
Documentation/date-formats.adoc | 6 ++++++
t/t0006-date.sh | 11 +++++++++++
2 files changed, 17 insertions(+)
diff --git a/Documentation/date-formats.adoc b/Documentation/date-formats.adoc
index e24517c49..83f676585 100644
--- a/Documentation/date-formats.adoc
+++ b/Documentation/date-formats.adoc
@@ -10,6 +10,12 @@ Git internal format::
`<time-zone-offset>` is a positive or negative offset from UTC.
For example CET (which is 1 hour ahead of UTC) is `+0100`.
+ It is safer to prepend the `<unix-timestamp>` with `@`
+ (e.g., `@0 +0000`), which forces Git to interpret it as a raw
+ timestamp. This is required for values less than 100,000,000
+ (which have fewer than 9 digits) to avoid confusion with other
+ date formats (like `YYYYMMDD`).
+
RFC 2822::
The standard date format as described by RFC 2822, for example
`Thu, 07 Apr 2005 22:13:13 +0200`.
diff --git a/t/t0006-date.sh b/t/t0006-date.sh
index 53ced36df..8b4e1870b 100755
--- a/t/t0006-date.sh
+++ b/t/t0006-date.sh
@@ -138,6 +138,13 @@ check_parse '1969-12-31 23:59:59 Z' bad
check_parse '1969-12-31 23:59:59 +11' bad
check_parse '1969-12-31 23:59:59 -11' bad
+# pathologically small timestamps requiring `@` prefix
+check_parse '@0 +0000' '1970-01-01 00:00:00 +0000'
+check_parse '@99999999 +0000' '1973-03-03 09:46:39 +0000'
+check_parse '99999999 +0000' bad
+check_parse '@100000000 +0000' '1973-03-03 09:46:40 +0000'
+check_parse '100000000 +0000' '1973-03-03 09:46:40 +0000'
+
REQUIRE_64BIT_TIME=HAVE_64BIT_TIME
check_parse '2099-12-31 23:59:59' '2099-12-31 23:59:59 +0000'
check_parse '2099-12-31 23:59:59 +00' '2099-12-31 23:59:59 +0000'
@@ -195,6 +202,10 @@ check_approxidate '6AM, June 7, 2009' '2009-06-07 06:00:00'
check_approxidate '2008-12-01' '2008-12-01 19:20:00'
check_approxidate '2009-12-01' '2009-12-01 19:20:00'
+# ambiguous raw timestamp
+check_approxidate '2000 +0000' '2000-08-30 19:20:00'
+check_approxidate '@2000 +0000' '1970-01-01 00:33:20'
+
check_date_format_human() {
t=$(($GIT_TEST_DATE_NOW - $1))
echo "$t -> $2" >expect
--
2.53.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH] doc: document and test `@` prefix for raw timestamps
2026-06-01 21:39 [PATCH] doc: document and test `@` prefix for raw timestamps Luna Schwalbe
@ 2026-06-02 0:23 ` Junio C Hamano
2026-06-02 6:17 ` Jeff King
2026-06-02 8:15 ` Luna Schwalbe
0 siblings, 2 replies; 5+ messages in thread
From: Junio C Hamano @ 2026-06-02 0:23 UTC (permalink / raw)
To: Luna Schwalbe; +Cc: git
Luna Schwalbe <dev@luna.gl> writes:
> diff --git a/Documentation/date-formats.adoc b/Documentation/date-formats.adoc
> index e24517c49..83f676585 100644
> --- a/Documentation/date-formats.adoc
> +++ b/Documentation/date-formats.adoc
> @@ -10,6 +10,12 @@ Git internal format::
> `<time-zone-offset>` is a positive or negative offset from UTC.
> For example CET (which is 1 hour ahead of UTC) is `+0100`.
>
> + It is safer to prepend the `<unix-timestamp>` with `@`
> + (e.g., `@0 +0000`), which forces Git to interpret it as a raw
> + timestamp. This is required for values less than 100,000,000
> + (which have fewer than 9 digits) to avoid confusion with other
> + date formats (like `YYYYMMDD`).
Does this "additional paragraph" format correctly, instead of
rendered as a literal block (typically typeset in typewriter font,
monospace)? Don't you need to do something like what is done for
"ISO 8601::" that appears later in the same file? I.e. lose the
four-space indent and replace the blank line before it with a single
'+' list continuation operator?
> +# pathologically small timestamps requiring `@` prefix
> +check_parse '@0 +0000' '1970-01-01 00:00:00 +0000'
> +check_parse '@99999999 +0000' '1973-03-03 09:46:39 +0000'
> +check_parse '99999999 +0000' bad
This is totally outside the scope of this topic, but we might want
to enhance the rule a bit to declare this is *not* ambigous. As
there is no 99th month or 99th day, this cannot be in the YYYYMMDD
date format.
> +check_parse '@100000000 +0000' '1973-03-03 09:46:40 +0000'
> +check_parse '100000000 +0000' '1973-03-03 09:46:40 +0000'
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] doc: document and test `@` prefix for raw timestamps
2026-06-02 0:23 ` Junio C Hamano
@ 2026-06-02 6:17 ` Jeff King
2026-06-02 8:15 ` Luna Schwalbe
1 sibling, 0 replies; 5+ messages in thread
From: Jeff King @ 2026-06-02 6:17 UTC (permalink / raw)
To: Luna Schwalbe; +Cc: git, Junio C Hamano
On Tue, Jun 02, 2026 at 09:23:34AM +0900, Junio C Hamano wrote:
> > + It is safer to prepend the `<unix-timestamp>` with `@`
> > + (e.g., `@0 +0000`), which forces Git to interpret it as a raw
> > + timestamp. This is required for values less than 100,000,000
> > + (which have fewer than 9 digits) to avoid confusion with other
> > + date formats (like `YYYYMMDD`).
>
> Does this "additional paragraph" format correctly, instead of
> rendered as a literal block (typically typeset in typewriter font,
> monospace)? Don't you need to do something like what is done for
> "ISO 8601::" that appears later in the same file? I.e. lose the
> four-space indent and replace the blank line before it with a single
> '+' list continuation operator?
Yes, I think so. As a tip for contributors, running:
cd Documentation
./doc-diff HEAD^ HEAD
is often good for seeing a rough approximation of the rendered doc. It
shows here that the result is incorrectly indented versus the rest of
the section.
Sadly it is somewhat limited in terms of typography, since it is diffing
the roff-rendered manpages. So you wouldn't realize that it is rendered
in a typewriter font, as you would if you looked at the html output.
Spot-checking the html is also a good thing to do when writing doc
patches.
-Peff
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] doc: document and test `@` prefix for raw timestamps
2026-06-02 0:23 ` Junio C Hamano
2026-06-02 6:17 ` Jeff King
@ 2026-06-02 8:15 ` Luna Schwalbe
2026-06-02 9:10 ` Junio C Hamano
1 sibling, 1 reply; 5+ messages in thread
From: Luna Schwalbe @ 2026-06-02 8:15 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
> Does this "additional paragraph" format correctly, instead of
> rendered as a literal block (typically typeset in typewriter font,
> monospace)? Don't you need to do something like what is done for
> "ISO 8601::" that appears later in the same file? I.e. lose the
> four-space indent and replace the blank line before it with a single
> '+' list continuation operator?
Terribly sorry, you're right of course, I somehow forgot to actually
build and check the docs. Will send an updated patch right away.
> This is totally outside the scope of this topic, but we might want
> to enhance the rule a bit to declare this is *not* ambigous. As
> there is no 99th month or 99th day, this cannot be in the YYYYMMDD
> date format.
I agree there is room for change with this rule, although I'm not sure
how sensible it is to start allowing certain values based on whether
they are also a valid calendar date or not (we'd end up trying to parse
YYYYMMDD first, and only afterwards do the actual timestamp parsing; I
feel like this might just make the system less predictable for users in
practice).
As far as I can tell the rule is technically not necessary at all (apart
from some unusual approxidate interpretations like the `2000 +0000`
example, which I honestly think are more confusing than useful), seeing
that YYYYMMDD isn't a supported format anywhere.
If we want to have it as a safeguard tho, better documentation is
probably the most important aspect. As a user, ideally I'd love to get a
"ambiguous date format, prefix with @ if you intend to specify a raw
timestamp" kind of error message, but I suspect that might be difficult
to implement.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] doc: document and test `@` prefix for raw timestamps
2026-06-02 8:15 ` Luna Schwalbe
@ 2026-06-02 9:10 ` Junio C Hamano
0 siblings, 0 replies; 5+ messages in thread
From: Junio C Hamano @ 2026-06-02 9:10 UTC (permalink / raw)
To: Luna Schwalbe; +Cc: git
Luna Schwalbe <dev@luna.gl> writes:
> > Does this "additional paragraph" format correctly, instead of
> > rendered as a literal block (typically typeset in typewriter font,
> > monospace)? Don't you need to do something like what is done for
> > "ISO 8601::" that appears later in the same file? I.e. lose the
> > four-space indent and replace the blank line before it with a single
> > '+' list continuation operator?
>
> Terribly sorry, you're right of course, I somehow forgot to actually
> build and check the docs. Will send an updated patch right away.
No need to be sorry---we all make mistakes.
> As far as I can tell the rule is technically not necessary at all (apart
> from some unusual approxidate interpretations like the `2000 +0000`
> example, which I honestly think are more confusing than useful), seeing
> that YYYYMMDD isn't a supported format anywhere.
Sounds good. In any case, that is totally outside the scope of this
patch.
Thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-06-02 9:10 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-01 21:39 [PATCH] doc: document and test `@` prefix for raw timestamps Luna Schwalbe
2026-06-02 0:23 ` Junio C Hamano
2026-06-02 6:17 ` Jeff King
2026-06-02 8:15 ` Luna Schwalbe
2026-06-02 9:10 ` Junio C Hamano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox