blob: 622bdf6ed9571d6513ef7ff34f9f04e794073352 (
plain) (
blame)
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
%prep
if zmodload zsh/datetime 2>/dev/null; then
setopt multibyte
unset LC_ALL
LC_TIME=C
TZ=UTC+0
# It's not clear this skip_extensions is correct, but the
# format in question is causing problems on Solaris.
# We'll revist this after the release.
[[ "$(strftime %^_10B 0 2>/dev/null)" = " JANUARY" ]] || skip_extensions=1
[[ "$(LC_TIME=ja_JP.UTF-8 strftime %OS 1 2>/dev/null)" = 一 ]] || skip_japanese=1
else
ZTST_unimplemented="can't load the zsh/datetime module for testing"
fi
%test
strftime '' 0
strftime %y 0
strftime %Y 1000000000
strftime %x 1200000000
strftime %X 1200000001
0:basic format specifiers
>
>70
>2001
>01/10/08
>21:20:01
strftime %-m_%f_%K_%L 1181100000
strftime %6. 0
0:zsh extensions
>6_6_3_3
>000000
if [[ $skip_extensions = 1 ]]; then
ZTST_skip="strftime extensions not supported"
elif [[ $skip_japanese = 1 ]]; then
ZTST_skip="Japanese UTF-8 locale not supported"
else
(
LC_TIME=ja_JP.UTF-8
strftime %Ey 1000000000
strftime %Oy 1000000000
strftime %Ex 1000000000
strftime %OS 1000000000
strftime %03Ey 650000000
)
fi
0:alternate format extensions
>13
>一
>平成13年09月09日
>四十
>002
if [[ $skip_extensions = 1 ]]; then
ZTST_skip="strftime extensions not supported"
else
(
strftime '%#A' 0
strftime '%^_10B' 0
strftime %03Ey 650000000
strftime %-Oe 0
# width=400 is too wide and should cause an error
strftime %400d 0 2> /dev/null || echo OK
)
fi
0:various extensions
>THURSDAY
> JANUARY
>090
>1
>OK
print -r -- ${(V)"$(strftime $'%Y\0%m\0%d' 100000000)"}
0:Embedded nulls
>1973^@03^@03
# We assume '%@' is not a valid format on any OSs.
# The result can be '%@' (Linux), '@' (BSDs) or an error (Cygwin).
[[ $(strftime '%@' 0 2> /dev/null) == (%|)@ || $? != 0 ]]
0:bad format specifier
# This test may fail at 23:59:59.xxx on New Year's Eve :/
[[ "$( strftime '%Y' )" == "$( strftime '%Y' "$EPOCHSECONDS" )" ]]
0:epochtime optional
strftime '%Y-%m-%d %H:%M:%S.%3.' 1012615322
strftime '%Y-%m-%d %H:%M:%S.%3.' 1012615322 0
strftime '%Y-%m-%d %H:%M:%S.%3.' 1012615322 2
strftime '%Y-%m-%d %H:%M:%S.%3.' 1012615322 $(( 222 * (10 ** 6) ))
0:optional nanoseconds
>2002-02-02 02:02:02.000
>2002-02-02 02:02:02.000
>2002-02-02 02:02:02.000
>2002-02-02 02:02:02.222
strftime '%Y' '' 2> /dev/null
1:empty epochtime not allowed
strftime '%Y' 1012615322 '' 2> /dev/null
1:empty nanoseconds not allowed
strftime '%N' 1012615322 $(( 10 ** 9 )) 2> /dev/null
1:too-large nanoseconds not allowed
strftime '%N' 1012615322 ${(l<64><9>):-} 2> /dev/null
1:overflowed nanoseconds not allowed
strftime '%N' 1012615322 -1 2> /dev/null
1:negative nanoseconds not allowed
strftime -r '%Y' 2> /dev/null
1:-r timestring not optional
# This tests rounding up and the use of repeated %.s
strftime '%Y-%m-%d %H:%M:%S.%3..%3.' 1012615322 $(( 999_999 ))
# These test the ceiling on rounding up
for 1 in %. %1. %3. %6. %9. %12.; do
print -rn - "$1 "
strftime "%Y-%m-%d %H:%M:%S.$1" 1012615322 $(( 999_999_999 ))
done
0:%. truncation
>2002-02-02 02:02:02.001.001
>%. 2002-02-02 02:02:02.999
>%1. 2002-02-02 02:02:02.9
>%3. 2002-02-02 02:02:02.999
>%6. 2002-02-02 02:02:02.999999
>%9. 2002-02-02 02:02:02.999999999
>%12. 2002-02-02 02:02:02.999999999
strftime -n 'one line%n' 2> /dev/null
0:-n option
>one line
|