Merge pull request #1673 from mustrumr/date-fixes

Date fixes
This commit is contained in:
Lennart Poettering
2015-10-25 22:58:00 +01:00
4 changed files with 26 additions and 16 deletions
+6 -6
View File
@@ -117,12 +117,12 @@
<refsect1>
<title>Parsing Timestamps</title>
<para>When parsing systemd will accept a similar syntax, but expects
no timezone specification, unless it is given as the literal string
"UTC". In this case the time is considered in UTC time, otherwise in
the local timezone. The weekday specification is optional, but when
the weekday is specified it must either be in the abbreviated
(<literal>Wed</literal>) or non-abbreviated
<para>When parsing systemd will accept a similar syntax, but
expects no timezone specification, unless it is given as the
literal string "UTC". In this case the time is considered in UTC,
otherwise in the local timezone. The weekday specification is
optional, but when the weekday is specified it must either be in
the abbreviated (<literal>Wed</literal>) or non-abbreviated
(<literal>Wednesday</literal>) English language form (case does
not matter), and is not subject to the locale choice of the user.
Either the date, or the time part may be omitted, in which case
+6 -3
View File
@@ -650,6 +650,7 @@ fail:
int calendar_spec_from_string(const char *p, CalendarSpec **spec) {
CalendarSpec *c;
int r;
const char *utc;
assert(p);
assert(spec);
@@ -661,9 +662,11 @@ int calendar_spec_from_string(const char *p, CalendarSpec **spec) {
if (!c)
return -ENOMEM;
c->utc = endswith_no_case(p, "UTC");
if (c->utc)
p = strndupa(p, strlen(p) - strlen(" UTC"));
utc = endswith_no_case(p, " UTC");
if (utc) {
c->utc = true;
p = strndupa(p, utc - p);
}
if (strcaseeq(p, "minutely")) {
r = const_chain(0, &c->second);
+6 -6
View File
@@ -479,7 +479,7 @@ int parse_timestamp(const char *t, usec_t *usec) {
};
const char *k;
bool utc;
const char *utc;
struct tm tm, copy;
time_t x;
usec_t x_usec, plus = 0, minus = 0, ret;
@@ -529,8 +529,8 @@ int parse_timestamp(const char *t, usec_t *usec) {
goto finish;
} else if (endswith(t, " ago")) {
t = strndupa(t, strlen(t) - strlen(" ago"));
} else if ((k = endswith(t, " ago"))) {
t = strndupa(t, k - t);
r = parse_sec(t, &minus);
if (r < 0)
@@ -538,8 +538,8 @@ int parse_timestamp(const char *t, usec_t *usec) {
goto finish;
} else if (endswith(t, " left")) {
t = strndupa(t, strlen(t) - strlen(" left"));
} else if ((k = endswith(t, " left"))) {
t = strndupa(t, k - t);
r = parse_sec(t, &plus);
if (r < 0)
@@ -550,7 +550,7 @@ int parse_timestamp(const char *t, usec_t *usec) {
utc = endswith_no_case(t, " UTC");
if (utc)
t = strndupa(t, strlen(t) - strlen(" UTC"));
t = strndupa(t, utc - t);
x = ret / USEC_PER_SEC;
x_usec = 0;
+8 -1
View File
@@ -43,6 +43,12 @@ static void test_should_pass(const char *p) {
assert_se(parse_timestamp(buf, &q) >= 0);
}
static void test_should_parse(const char *p) {
usec_t t;
assert_se(parse_timestamp(p, &t) >= 0);
}
static void test_should_fail(const char *p) {
usec_t t;
@@ -86,7 +92,8 @@ int main(int argc, char *argv[]) {
test_one_noutc("+2y 4d");
test_one_noutc("5months ago");
test_one_noutc("@1395716396");
test_one_noutc("today UTC");
test_should_parse("today UTC");
test_should_fail("today UTC UTC");
return 0;
}