2009-08-31 06:30:16 +04:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='test date parsing and printing'
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
# arbitrary reference time: 2009-08-30 19:20:00
|
|
|
|
TEST_DATE_NOW=1251660000; export TEST_DATE_NOW
|
|
|
|
|
|
|
|
check_show() {
|
|
|
|
t=$(($TEST_DATE_NOW - $1))
|
|
|
|
echo "$t -> $2" >expect
|
|
|
|
test_expect_${3:-success} "relative date ($2)" "
|
|
|
|
test-date show $t >actual &&
|
2012-08-27 09:36:49 +04:00
|
|
|
test_i18ncmp expect actual
|
2009-08-31 06:30:16 +04:00
|
|
|
"
|
|
|
|
}
|
|
|
|
|
|
|
|
check_show 5 '5 seconds ago'
|
|
|
|
check_show 300 '5 minutes ago'
|
|
|
|
check_show 18000 '5 hours ago'
|
|
|
|
check_show 432000 '5 days ago'
|
|
|
|
check_show 1728000 '3 weeks ago'
|
|
|
|
check_show 13000000 '5 months ago'
|
|
|
|
check_show 37500000 '1 year, 2 months ago'
|
|
|
|
check_show 55188000 '1 year, 9 months ago'
|
|
|
|
check_show 630000000 '20 years ago'
|
2009-10-03 08:20:18 +04:00
|
|
|
check_show 31449600 '12 months ago'
|
date: avoid "X years, 12 months" in relative dates
When relative dates are more than about a year ago, we start
writing them as "Y years, M months". At the point where we
calculate Y and M, we have the time delta specified as a
number of days. We calculate these integers as:
Y = days / 365
M = (days % 365 + 15) / 30
This rounds days in the latter half of a month up to the
nearest month, so that day 16 is "1 month" (or day 381 is "1
year, 1 month").
We don't round the year at all, though, meaning we can end
up with "1 year, 12 months", which is silly; it should just
be "2 years".
Implement this differently with months of size
onemonth = 365/12
so that
totalmonths = (long)( (days + onemonth/2)/onemonth )
years = totalmonths / 12
months = totalmonths % 12
In order to do this without floats, we write the first formula as
totalmonths = (days*12*2 + 365) / (365*2)
Tests and inspiration by Jeff King.
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-04-20 13:12:11 +04:00
|
|
|
check_show 62985600 '2 years ago'
|
2009-08-31 06:30:16 +04:00
|
|
|
|
|
|
|
check_parse() {
|
|
|
|
echo "$1 -> $2" >expect
|
2010-07-04 14:48:35 +04:00
|
|
|
test_expect_${4:-success} "parse date ($1${3:+ TZ=$3})" "
|
|
|
|
TZ=${3:-$TZ} test-date parse '$1' >actual &&
|
2009-08-31 06:30:16 +04:00
|
|
|
test_cmp expect actual
|
|
|
|
"
|
|
|
|
}
|
|
|
|
|
|
|
|
check_parse 2008 bad
|
|
|
|
check_parse 2008-02 bad
|
|
|
|
check_parse 2008-02-14 bad
|
|
|
|
check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 +0000'
|
2010-07-04 14:48:35 +04:00
|
|
|
check_parse '2008-02-14 20:30:45 -0500' '2008-02-14 20:30:45 -0500'
|
2011-09-09 14:10:33 +04:00
|
|
|
check_parse '2008-02-14 20:30:45 -0015' '2008-02-14 20:30:45 -0015'
|
|
|
|
check_parse '2008-02-14 20:30:45 -5' '2008-02-14 20:30:45 +0000'
|
|
|
|
check_parse '2008-02-14 20:30:45 -5:' '2008-02-14 20:30:45 +0000'
|
|
|
|
check_parse '2008-02-14 20:30:45 -05' '2008-02-14 20:30:45 -0500'
|
|
|
|
check_parse '2008-02-14 20:30:45 -:30' '2008-02-14 20:30:45 +0000'
|
|
|
|
check_parse '2008-02-14 20:30:45 -05:00' '2008-02-14 20:30:45 -0500'
|
2010-07-07 03:34:20 +04:00
|
|
|
check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 -0500' EST5
|
2009-08-31 06:30:16 +04:00
|
|
|
|
|
|
|
check_approxidate() {
|
|
|
|
echo "$1 -> $2 +0000" >expect
|
|
|
|
test_expect_${3:-success} "parse approxidate ($1)" "
|
|
|
|
test-date approxidate '$1' >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
"
|
|
|
|
}
|
|
|
|
|
|
|
|
check_approxidate now '2009-08-30 19:20:00'
|
|
|
|
check_approxidate '5 seconds ago' '2009-08-30 19:19:55'
|
|
|
|
check_approxidate 5.seconds.ago '2009-08-30 19:19:55'
|
|
|
|
check_approxidate 10.minutes.ago '2009-08-30 19:10:00'
|
|
|
|
check_approxidate yesterday '2009-08-29 19:20:00'
|
|
|
|
check_approxidate 3.days.ago '2009-08-27 19:20:00'
|
|
|
|
check_approxidate 3.weeks.ago '2009-08-09 19:20:00'
|
2009-08-31 06:31:42 +04:00
|
|
|
check_approxidate 3.months.ago '2009-05-30 19:20:00'
|
|
|
|
check_approxidate 2.years.3.months.ago '2007-05-30 19:20:00'
|
2009-08-31 06:30:16 +04:00
|
|
|
|
|
|
|
check_approxidate '6am yesterday' '2009-08-29 06:00:00'
|
|
|
|
check_approxidate '6pm yesterday' '2009-08-29 18:00:00'
|
|
|
|
check_approxidate '3:00' '2009-08-30 03:00:00'
|
|
|
|
check_approxidate '15:00' '2009-08-30 15:00:00'
|
|
|
|
check_approxidate 'noon today' '2009-08-30 12:00:00'
|
|
|
|
check_approxidate 'noon yesterday' '2009-08-29 12:00:00'
|
|
|
|
|
|
|
|
check_approxidate 'last tuesday' '2009-08-25 19:20:00'
|
|
|
|
check_approxidate 'July 5th' '2009-07-05 19:20:00'
|
|
|
|
check_approxidate '06/05/2009' '2009-06-05 19:20:00'
|
|
|
|
check_approxidate '06.05.2009' '2009-05-06 19:20:00'
|
|
|
|
|
|
|
|
check_approxidate 'Jun 6, 5AM' '2009-06-06 05:00:00'
|
|
|
|
check_approxidate '5AM Jun 6' '2009-06-06 05:00:00'
|
|
|
|
check_approxidate '6AM, June 7, 2009' '2009-06-07 06:00:00'
|
|
|
|
|
approxidate: allow ISO-like dates far in the future
When we are parsing approxidate strings and we find three
numbers separate by one of ":/-.", we guess that it may be a
date. We feed the numbers to match_multi_number, which
checks whether it makes sense as a date in various orderings
(e.g., dd/mm/yy or mm/dd/yy, etc).
One of the checks we do is to see whether it is a date more
than 10 days in the future. This was added in 38035cf (date
parsing: be friendlier to our European friends.,
2006-04-05), and lets us guess that if it is currently April
2014, then "10/03/2014" is probably March 10th, not October
3rd.
This has a downside, though; if you want to be overly
generous with your "--until" date specification, we may
wrongly parse "2014-12-01" as "2014-01-12" (because the
latter is an in-the-past date). If the year is a future year
(i.e., both are future dates), it gets even weirder. Due to
the vagaries of approxidate, months _after_ the current date
(no matter the year) get flipped, but ones before do not.
This patch drops the "in the future" check for dates of this
form, letting us treat them always as yyyy-mm-dd, even if
they are in the future. This does not affect the normal
dd/mm/yyyy versus mm/dd/yyyy lookup, because this code path
only kicks in when the first number is greater than 70
(i.e., it must be a year, and cannot be either a date or a
month).
The one possible casualty is that "yyyy-dd-mm" is less
likely to be chosen over "yyyy-mm-dd". That's probably OK,
though because:
1. The difference happens only when the date is in the
future. Already we prefer yyyy-mm-dd for dates in the
past.
2. It's unclear whether anybody even uses yyyy-dd-mm
regularly. It does not appear in lists of common date
formats in Wikipedia[1,2].
3. Even if (2) is wrong, it is better to prefer ISO-like
dates, as that is consistent with what we use elsewhere
in git.
[1] http://en.wikipedia.org/wiki/Date_and_time_representation_by_country
[2] http://en.wikipedia.org/wiki/Calendar_date
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-11-14 00:43:31 +03:00
|
|
|
check_approxidate '2008-12-01' '2008-12-01 19:20:00'
|
|
|
|
check_approxidate '2009-12-01' '2009-12-01 19:20:00'
|
|
|
|
|
2009-08-31 06:30:16 +04:00
|
|
|
test_done
|