1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
From 2179e70febda8fdfcaf214a125805f6ce5ee393a Mon Sep 17 00:00:00 2001
From: Vincent Ambo <tazjin@google.com>
Date: Mon, 6 Jan 2020 16:00:52 +0000
Subject: [PATCH] date: add "dottime" format
Adds dottime (as defined on https://dotti.me) as a timestamp format.
This format is designed to simplify working with timestamps across
many different timezones by keeping the timestamp format itself in
UTC (and indicating this with a dot character), but appending the
local offset.
This is implemented as a new format because the timestamp needs to be
rendered both as UTC and including the offset, an implementation using
a strftime formatting string is not sufficient.
---
Documentation/rev-list-options.txt | 3 +++
builtin/blame.c | 3 +++
cache.h | 3 ++-
date.c | 17 +++++++++++++++++
t/t0006-date.sh | 2 ++
5 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index bfd02ade99..0d49eb448f 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -890,6 +890,9 @@ omitted.
1970). As with `--raw`, this is always in UTC and therefore `-local`
has no effect.
+`--date=dottime` shows the date in dottime format (rendered as UTC,
+but suffixed with the local timezone offset if given)
+
`--date=format:...` feeds the format `...` to your system `strftime`,
except for %z and %Z, which are handled internally.
Use `--date=format:%c` to show the date in your system locale's
diff --git a/builtin/blame.c b/builtin/blame.c
index bf1cecdf3f..edd4bf7e3b 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -981,6 +981,9 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
case DATE_STRFTIME:
blame_date_width = strlen(show_date(0, 0, &blame_date_mode)) + 1; /* add the null */
break;
+ case DATE_DOTTIME:
+ blame_date_width = sizeof("2006-10-19T15·00-0700");
+ break;
}
blame_date_width -= 1; /* strip the null */
diff --git a/cache.h b/cache.h
index 1554488d66..2b7b3387cf 100644
--- a/cache.h
+++ b/cache.h
@@ -1580,7 +1580,8 @@ enum date_mode_type {
DATE_RFC2822,
DATE_STRFTIME,
DATE_RAW,
- DATE_UNIX
+ DATE_UNIX,
+ DATE_DOTTIME
};
struct date_mode {
diff --git a/date.c b/date.c
index b0d9a8421d..0355c0676b 100644
--- a/date.c
+++ b/date.c
@@ -347,6 +347,21 @@ const char *show_date(timestamp_t time, int tz, const struct date_mode *mode)
tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec,
sign, tz / 100, tz % 100);
+ } else if (mode->type == DATE_DOTTIME) {
+ char sign = (tz >= 0) ? '+' : '-';
+ tz = abs(tz);
+
+ // Time is converted again without the timezone as the
+ // dottime format includes the zone only in offset
+ // position.
+ time_t t = gm_time_t(time, 0);
+ tm = gmtime(&t);
+ strbuf_addf(&timebuf, "%04d-%02d-%02dT%02d·%02d%c%02d%02d",
+ tm->tm_year + 1900,
+ tm->tm_mon + 1,
+ tm->tm_mday,
+ tm->tm_hour, tm->tm_min,
+ sign, tz / 100, tz % 100);
} else if (mode->type == DATE_RFC2822)
strbuf_addf(&timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d",
weekday_names[tm->tm_wday], tm->tm_mday,
@@ -918,6 +933,8 @@ static enum date_mode_type parse_date_type(const char *format, const char **end)
return DATE_UNIX;
if (skip_prefix(format, "format", end))
return DATE_STRFTIME;
+ if (skip_prefix(format, "dottime", end))
+ return DATE_DOTTIME;
/*
* Please update $__git_log_date_formats in
* git-completion.bash when you add new formats.
diff --git a/t/t0006-date.sh b/t/t0006-date.sh
index d9fcc829a9..b723db1f76 100755
--- a/t/t0006-date.sh
+++ b/t/t0006-date.sh
@@ -49,9 +49,11 @@ check_show short "$TIME" '2016-06-15'
check_show default "$TIME" 'Wed Jun 15 16:13:20 2016 +0200'
check_show raw "$TIME" '1466000000 +0200'
check_show unix "$TIME" '1466000000'
+check_show dottime "$TIME" '2016-06-15T14·13+0200'
check_show iso-local "$TIME" '2016-06-15 14:13:20 +0000'
check_show raw-local "$TIME" '1466000000 +0000'
check_show unix-local "$TIME" '1466000000'
+check_show dottime-local "$TIME" '2016-06-15T14·13+0000'
check_show 'format:%z' "$TIME" '+0200'
check_show 'format-local:%z' "$TIME" '+0000'
--
2.24.1.735.g03f4e72817-goog
|