usage: strptime fmt timestamp
Most other userspace implementations allow in date(1) the parsing
of dates. That way, one can use a date string, and manipulate it
in scripts. However, the current date(1) implementation only accepts
Unix epochs to describe date and time. Rather than patching date(1),
I decided to make it a different tool, which, I believe, is closer to
the Unix philosophy.
---
.gitignore | 1 +
Makefile | 1 +
README | 1 +
strptime.1 | 22 ++++++++++++++++++++++
strptime.c | 38 ++++++++++++++++++++++++++++++++++++++
5 files changed, 63 insertions(+)
create mode 100644 strptime.1
create mode 100644 strptime.c
diff --git a/.gitignore b/.gitignore
index daa7189..e591886 100644
--- a/.gitignore
+++ b/.gitignore
@@ -76,6 +76,7 @@
/split
/sponge
/strings
+/strptime
/sync
/tac
/tail
diff --git a/Makefile b/Makefile
index 8a4c1ef..55e00d9 100644
--- a/Makefile
+++ b/Makefile
@@ -165,6 +165,7 @@ BIN =\
split\
sponge\
strings\
+ strptime\
sync\
tac\
tail\
diff --git a/README b/README
index f16eab8..91a60f9 100644
--- a/README
+++ b/README
@@ -117,6 +117,7 @@ The following tools are implemented:
0=*|o split .
0=*|x sponge .
0#*|o strings .
+0=* x strptime .
0=*|x sync .
0=* x tac .
0=*|o tail .
diff --git a/strptime.1 b/strptime.1
new file mode 100644
index 0000000..8f91238
--- /dev/null
+++ b/strptime.1
@@ -0,0 +1,22 @@
+.Dd 2024-02-25
+.Dt STRPTIME 1
+.Os sbase
+.Sh NAME
+.Nm strptime
+.Nd parse date and time string
+.Sh SYNOPSIS
+.Nm
+.Ar time format
+.Sh DESCRIPTION
+.Nm
+parses
+.Ar time
+according to
+.Ar format
+(see
+.Xr strptime 3 ) .
+and prints it as the number of seconds since the
+Unix epoch.
+.Sh SEE ALSO
+.Xr date 1 ,
+.Xr strptime 3
diff --git a/strptime.c b/strptime.c
new file mode 100644
index 0000000..381a804
--- /dev/null
+++ b/strptime.c
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <time.h>
+
+#include "util.h"
+
+static void
+usage(void)
+{
+ eprintf("usage: %s format time\n", argv0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ struct tm tm;
+ time_t time;
+ char *fmt;
+
+ ARGBEGIN {
+ default:
+ usage();
+ } ARGEND
+
+ /* This make mktime(3) guess whether Daylight Saving Time is in effect.
+ * If not specified, the output is non-deterministic, considering that
+ * tm is initially random */
+ tm.tm_isdst = -1;
+
+ if (argc != 2)
+ usage();
+ if (strptime(argv[1], argv[0], &tm) == NULL)
+ eprintf("unable to parse\n");
+ if ((time = mktime(&tm)) == -1)
+ eprintf("mktime:");
+
+ printf("%ld\n", time);
+ return 0;
+}
--
2.43.0