I’m using jq to process CSV files to use in a Plain Text Accounting environment, specifically using hledger. I mention all this, not because it’s salient, but purely to make it easier for you to find this article by a web search.

The Symptom

$ jq -n '"8/4/2023" | strptime("%D")'
jq: error (at <unknown>): date "8/4/2023" does not match format "%D"

$ jq -n '"8/4/2023" | strptime("%m/%d/%y")'
jq: error (at <unknown>): date "8/4/2023" does not match format "%m/%d/%y"

WAT?!

The Problem

The strptime pattern %y matches the string 23, but not the string 2023. It’s pretty clear in the man page, if a little unexpected.

%y     The  year  within  century  (0–99).   When a century is not otherwise specified, values in the range 69–99 refer to years in the
      twentieth century (1969–1999); values in the range 00–68 refer to years in the twenty-first century (2000–2068).

%Y     The year, including century (for example, 1991).

The Solution

$ jq -n '"8/4/2023" | strptime("%m/%d/%Y")'
[
  2023,
  7,
  4,
  0,
  0,
  0,
  5,
  215
]