cancel
Showing results for 
Search instead for 
Did you mean: 

Five easy pieces

SJT
Contributor III
Contributor III

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"

 

2 ACCEPTED SOLUTIONS

fbodon
New Contributor II
New Contributor II

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

View solution in original post

Rolf
New Contributor III
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"

 

View solution in original post

16 REPLIES 16

MurrMack
New Contributor

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"

 

SJT
Contributor III
Contributor III

Doesn’t get easier than that! 😂

But the challenge is to code it in q.

fbodon
New Contributor II
New Contributor II

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

 

David

fbodon
New Contributor II
New Contributor II

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

Elegant! But is the datetime type not deprecated?

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

Spoiler
raze (ssr[;".";"-"];"T",)@'string `date`time$.z.p
/ or alternatively
"T" sv (ssr[;".";"-"];::)@'string `date`time$.z.p

 

 

David

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.) 

SJT
Contributor III
Contributor III

Too easy? Too… unnecessary?  Let’s 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

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

Spoiler
.dt.fmtd:{(`iso`dmy`mdy!({ssr[string x;".";"-"]};{"/" sv string `dd`mm`year$x};{"/" sv string `mm`dd`year$x}))[x] `date$y}

 

David

Rolf
New Contributor III
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"

 

SJT
Contributor III
Contributor III

Ingenious use of Prepare Text!

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

Rolf
New Contributor III

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? 🙏🏻

David

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

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