summaryrefslogtreecommitdiff
path: root/Src/Modules/datetime.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Modules/datetime.c')
-rw-r--r--Src/Modules/datetime.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/Src/Modules/datetime.c b/Src/Modules/datetime.c
index 63a04dc89..86c61cf1c 100644
--- a/Src/Modules/datetime.c
+++ b/Src/Modules/datetime.c
@@ -53,10 +53,12 @@ reverse_strftime(char *nam, char **argv, char *scalar, int quiet)
* to use the current timezone. This is probably the best guess;
* it's the one that will cause dates and times output by strftime
* without the -r option and without an explicit timezone to be
- * converted back correctly.
+ * converted back correctly. Additionally, tm_mday is set to 1
+ * as that and not 0 corresponds to the first of the month.
*/
(void)memset(&tm, 0, sizeof(tm));
tm.tm_isdst = -1;
+ tm.tm_mday = 1;
endp = strptime(argv[1], argv[0], &tm);
if (!endp) {
@@ -96,7 +98,7 @@ reverse_strftime(char *nam, char **argv, char *scalar, int quiet)
static int
output_strftime(char *nam, char **argv, Options ops, UNUSED(int func))
{
- int bufsize, x;
+ int bufsize, x, len;
char *endptr = NULL, *scalar = NULL, *buffer;
time_t secs;
struct tm *t;
@@ -129,16 +131,19 @@ output_strftime(char *nam, char **argv, Options ops, UNUSED(int func))
bufsize = strlen(argv[0]) * 8;
buffer = zalloc(bufsize);
+ len = 0;
for (x=0; x < 4; x++) {
- if (ztrftime(buffer, bufsize, argv[0], t, 0L) >= 0)
+ if ((len = ztrftime(buffer, bufsize, argv[0], t, 0L)) >= 0)
break;
buffer = zrealloc(buffer, bufsize *= 2);
}
+ DPUTS(len < 0, "bad output from ztrftime");
if (scalar) {
- setsparam(scalar, metafy(buffer, -1, META_DUP));
+ setsparam(scalar, metafy(buffer, len, META_DUP));
} else {
- printf("%s\n", buffer);
+ fwrite(buffer, 1, len, stdout);
+ putchar('\n');
}
zfree(buffer, bufsize);