Five easy pieces

https://learninghub.kx.com/forums/topic/five-easy-pieces

Some days it takes me a while to get started. I need to warm up my hands and brain. Hot coffee and a small problem help.

.z.p gives me Co-ordinated Universal Time. A neat way to convert that into a string in the unambiguous ISO 8601 format? That is

q).z.p 2022.03.02D11:50:33.883331000

to give “2022-03-02T11:50:33.883”

 

Doesnt get easier than that!

But the challenge is to code it in q.

Too easy? Too unnecessary? Lets kick it up.

q)ts: .z.d+.z.t 
q).h.iso8601 ts 
"2022-03-02T09:12:34.684000000" 
q).dt.fmtd[;ts] each `iso`dmy`mdy 
"2022-03-02" "2/3/2022" "3/2/2022"

Write .dt.fmtd without control words: no if, do, while or Cond.

Elegant! But is the datetime type not deprecated?

Nice! Though I always wonder about using powerful ssr to replace just one character with another.

 

q)?[;“-”;] . reverse 1(“.”=) string `date$.z.p “2022-03-03”

 

(The Zen monks wanted to play.)

Ingenious use of Prepare Text!

Maybe a simpler version of it would be “T"sv string"dt”$.z.p.

I speculate its because its the international standard for dates so Prepare Text uses it.

At any rate I should note in the Reference that it does so.

Now documented:
https://code.kx.com/q/ref/file-text/#prepare-text

You can use the built in .h.iso8601

q).h.iso8601 .z.p 
"2022-03-02T12:27:37.506760000" 
q)-6_.h.iso8601 .z.p 
"2022-03-02T12:27:37.506"

 

I would do

@[-6_string .z.p; 4 7 10; :; “–T”]

or if you prefer narrow square brackets then

@[; 4 7 10; :; “–T”] -6_string .z.p

I took a similar approach

@[;4 7;:;“-”] string `datetime$.z.p

 

Haha. Nice! The good old datetime! I already erased it from my memory

Here is my quick attempt for which I’m sure there is a much more elegant solution

.dt.fmtd:{(isodmymdy!({ssr[string x;".";"-"]};{"/" sv string ddmmyear$x};{“/” sv string mmddyear$x}))[x] date$y}

 

Very well gentlemen, I raze you a substitute for our departed datetime type with date`time

raze (ssr[;“.”;“-”];“T”,)@'string datetime$.z.p

/ or alternatively

“T” sv (ssr[;“.”;“-”];::)@'string datetime$.z.p

 

 

q)f:"T"0:2 1#"dt"$ 
q)f .z.p "2022-03-04T11:07:52.077" 

/ if you want to be picky about the type 
q)f:first"T"0:2 1#"dt"$ 
q)f .z.p "2022-03-04T11:08:49.988"

 

0: gets you the dashes in the date

I would love to know how / why this period to dash conversion is happening if anyone can shed some light?