如何在 Q/KDB 中生成格式化的日期字符串?

How to produce a formatted date string in Q/KDB?

如何从 Q 日期类型生成 ISO 日期字符串 "yyyy-MM-dd"?我查看了连接各个部分,但我什至无法获得 day/month,例如d:2015.12.01;d.month 打印 2015.12,即不仅仅是月份。

q)"-" sv "." vs string[2015.12.01]
"2015-12-01"

vs 来自字符串的向量,以“.”分割多于; sv 字符串转向量,用上面的“-”连接。

请记住,字符串只是一个字符数组,因此您可以根据需要通过索引获取每个部分。但是上面的内容很有用,因为 vs 的结果向量给出了一个长度为 3 的向量,您可以按自己喜欢的方式进行操作

如果您打算大规模进行(即大量 vector/list 日期或 table 中的一列)并且您确定日期总是 well-formed, 那么你可以使用 dot-amend:

q)update .[;(::;4 7);:;"-"]string date from ([] date:2#.z.D)
date
------------
"2016-01-04"
"2016-01-04"

这样您就不必申请 vector/list 的 "each" 条目,它适用于 vector/list 本身。

我正在使用这样的东西:

q)ymd:{[x;s](4#d),s,(2#-5#d),s,-2#d:string[x]}
q)ymd[.z.D;"-"]
"2016-01-25"
q)ymd[.z.D;"/"]
"2016/01/25"
q)ymd[.z.D;""]
"20160125"

或表格:

q)t:([]a:5#1;5#.z.d)
q)update s:ymd[;"-"] each d from t
a d          s
-------------------------
1 2016.01.26 "2016-01-26"
1 2016.01.26 "2016-01-26"
1 2016.01.26 "2016-01-26"
1 2016.01.26 "2016-01-26"
1 2016.01.26 "2016-01-26"

请更改更新语句中的分隔符,如 -/

update s:{ssr[string x;".";y]}'[d;"-"] from ([]a:5#1;5?.z.d)
a d          s
-------------------------
1 2010.12.31 "2010-12-31"
1 2012.08.24 "2012-08-24"
1 2004.12.05 "2004-12-05"
1 2000.10.02 "2000-10-02"
1 2006.09.10 "2006-09-10"

查看此 GitHub library 以了解日期时间格式。它支持 excel 格式化日期和时间的方式。它可能不适合格式化大量对象。

q).dtf.format["yyyy-mm-dd"; 2018.06.08T01:02:03.456]  
"2018-06-08"

时间格式:

q).dtf.format["yyyy-mmmm-dd hh:uu AM/PM"; 2018.01.08T01:02:03.456]  
"2018-January-08 01:02 AM"

我相信 ISO8601 UTC 时间戳的最短(和最干净)选项可用,因为至少 kdb v3.4 将使用 .h.iso8601 内置

q).h.iso8601 .z.p
"2020-11-09T15:42:19.292301000"

或者,如果您只需要类似于 JS toISOString() 所做的毫秒数,请使用:

q).isotime:{(23#.h.iso8601 x),"Z"}
q).isotime[.z.p]
"2020-11-09T16:02:02.601Z"
q).isotime[2015.12.01]
"2015-12-01T00:00:00.000Z"

注意 .z.p 很重要,因为 .h.iso8601 .z.P 会默默地为您提供没有时区的本地时间(+0100 等),因此它仍会被兼容的 ISO8601 解析器解释为 UTC :(