Skip to content

.qdate - Date Parsing

Basic Usage

Parsing Dates

To convert a date string into a timestamp, use .qdate.resolve with the date format string.


.qdate.resolve["%A %B %d, %Y"; "Friday October 12, 2018"];

/=> 2018.10.12D00:00:00.000000000

To convert a date string to a specific type, use .qdate.resolveAs with an additional desired type.

.qdate.resolveAs[`date; "%A %B %d, %Y"; "Friday October 12, 2018"];
/=> 2018.10.12

Printing Dates

Printing a date formats any temporal type into the provided date format.


.qdate.print["%A %B %d, %Y"; 2018.10.12];
/=> "Friday October 12, 2018"

.qdate.print["%A %B %d, %Y at %I:%M %p"; 2018.10.12D13:02:03.456];
/=> "Friday October 12, 2018 at 01:02 PM"

Overview

.qdate parses strings into q temporal data using formatters to decompose the components. This library is based off the GNU strptime parsing functionality. .qdate can convert to and from temporal types and string using these date formatter strings.

Formatters

Specifier Replaced By Example
%a Abbreviated weekday name Sun
%A Full weekday name Sunday
%b Abbreviated month name Mar
%B Full month name March
%c Synonym for %x %X 08/19/12 17:55:06
%C Synonym for %A, %B %e, %Y Sunday, March
%d Day of the month (01-31)* 19
%D Synonym for %m/%d/%y 08/19/12
%e Day of the month** 19
%F Synonym for %Y-%m-%d 2012-08-19
%g Year without century (00-99)* Epoch at 1900 12
%h Synonym for %b Mar
%H Hour in 24h format (00-23)* 14
%i Milliseconds (000-999)* 214
%I Hour in 12h format (01-12)* 05
%j Day of the year (001-366)* 102
%k Hour 24h format (0-23)** 14
%l Hour in 12h format (1-12)** 5
%m Month as a decimal number (01-12)* 08
%M Minute (00-59)* 55
%n Newline \n
%N Nanoseconds (000000000-999999999)* 123456789
%p AM or PM designation PM
%P Synonym for %Y.%m.%dD%H:%M:%S.%N (Timestamp) 2012.01.04D14:38:16.214000234
%r Synonym for %I:%M:%S %p 05:55:06 PM
%R Synonym for %H:%M 17:55
%s Number of seconds since the unix epoch 1465237003
%S Second (00-59)* 02
%t Tab \t
%T Synonym for %H:%M:%S 17:55:06
%u Microseconds (000000-999999) 123456
%w Weekday number starting on Sunday (0-6)* 4
%x Synonym for %D 08/19/12
%X Synonym for %T 17:55:06
%y Year without century (00-99)* Epoch at 2000 12
%Y Year with century 2012
%Z Timezone name or abbreviation EST
%z Timezone numerical offset (-1200-1200)* -0500
%% A % sign %
* Indicates zero padded
** Indicates blank padded

Padding

Note all %'s can have a numerical value representing their padding. If a value is zero padded then the number immediately following the % should be a 0. If it is blank padded then the number after the % should be an _.

dates: .qdate.print["%10_a %15_B %d, %Y"] 100?.z.d
/=> "    Thurs   October 21, 2010"
/=> "      Mon  February 17, 2014"
/=> "      Sat  February 24, 2007"
/=> "      Fri  December 19, 2014"
/=> "     Tues     March 11, 2003"
/=> ...

Parsing Dates

.qdate can parse dates that can be described using the above formatters. First, the formatter string is compiled into a specifier sequence and then applied to all dates that need to be resolved. As a shorthand .qdate.resolve performs this high-level operation on an array of strings. The following is an example of converting from raw strings to kdb+ timestamps using a formatter string.


dates: .qdate.print["%a %B %d, %Y"] 100?.z.d

/=> "Sat October 28, 2006"
/=> "Fri March 29, 2013"
/=> "Thurs July 05, 2007"
/=> "Fri August 29, 2003"
/=> "Sun March 21, 2004"
/=> "Mon January 07, 2013"
/=> "Sun February 11, 2001"
/=> ..

.qdate.resolve["%a %B %d, %Y"] dates;

/=> 2006.10.28D00:00:00.000000000
/=> 2013.04.04D00:00:00.000000000
/=> 2007.07.10D00:00:00.000000000
/=> 2003.09.04D00:00:00.000000000
/=> 2004.03.21D00:00:00.000000000
/=> 2013.01.09D00:00:00.000000000
/=> 2001.02.12D00:00:00.000000000
/=> ..

.qdate.resolveAs[`date; "%a %B %d, %Y"] dates;

/=> 2006.10.28
/=> 2013.04.04
/=> 2007.07.10
/=> 2003.09.04
/=> 2004.03.21
/=> 2013.01.09
/=> 2001.02.12
/=> ..

Parsing Dates with Leading Whitespace

Some dates are not padded with zeros when values are less than 10. For example, the date 2016/1/2 does not provide padding for the month and day values. Assuming the date is in the format yyyy/dd/mm, we can parse it with qdate using a whitespace token modifier for the month and day values.

// Without the whitespace modifier, this date will evaluate to null 
// because the input does not match the pattern
.qdate.resolveAs[`date; "%Y/%d/%m"] "2016/1/2";
/=> 0Nd

// Using the whitespace modifier _ accepts the given input
.qdate.resolveAs[`date; "%Y/%_d/%_m"] "2016/1/2";
/=> 2016.02.01

Parsing Dates with Timezones

Dates with timezones can be parsed to be GMT time by providing either a %z or %Z token depending on the format of the timezone.

.qdate.resolveAs[`time; "%H:%M %z"] "09:10 -0400"
/=> 13:10:00.000

Formatting Dates

.qdate can format a date into an arbitrary formatter sequence with any valid specifier string. This string must be passed to .qdate.print along with the dates to be formatted. The following is an example of formatting a set of random dates.


dates: .qdate.print["%a %B %d, %Y"] 100?.z.d

/=> "Sat October 28, 2006"
/=> "Fri March 29, 2013"
/=> "Thurs July 05, 2007"
/=> "Fri August 29, 2003"
/=> "Sun March 21, 2004"
/=> "Mon January 07, 2013"
/=> "Sun February 11, 2001"
/=> ..

.qdate.print

Prints a set of dates using the given formatter string. This converts a temporal type into strings using the given pattern to represent the data.

Parameters:

Name Type Description
fmt string Format string describing the organization of the pattern to print. This format string should combine identifier tokens to describe the format of an output date string.
dates .qdate.temporal | .qdate.temporal [] Collection of temporal data to represent using the provided pattern

Returns:

Type Description
string[] Pretty formatted date strings

Example: Printing a date as yyyy-mm-dd

 // %Y - Yeah with century
 // %m - Month as a number (01-12)
 // %d - Day of the month (01-31)
 .qdate.print["%Y-%m-%d"] 2015.06.07
 /=> "2015-06-07"

Example: Printing multiple dates

 dates: "d"$til 10;
 /=> 2000.01.01 2000.01.02 2000.01.03 2000.01.04 ..

 // %Y - Yeah with century
 // %m - Month as a number (01-12)
 // %d - Day of the month (01-31)
 .qdate.print["%Y/%m/%d"] dates
 /=> "2000/01/01"
 /=> "2000/01/02"
 /=> "2000/01/03"
 /=> "2000/01/04"
 /=> ..

Example: Printing a time

 // %I - Hour in 12 hour format
 // %M - Minute
 // %p - AM or PM designation
 .qdate.print["%I:%M %p"] 14:12:34.123
 /=> "02:12 PM"

Example: Printing a date and time

 // %D - Synonym for %m/%d/%y
 // %r - Synonym for %I:%M:%S %p
 .qdate.print["%D %r"] 2012.03.17D14:23:35.341
 /=> "03/17/12 02:23:35 PM"

Example: Printing using weekday and month names

 // %A - Full weekday name
 // %B - Full month name
 // %e - Day of the month without zero padding (1-31)
 // %Y - Yeah with century
 .qdate.print["%A %B %e, %Y"] 2010.07.02
 /=> "Friday July 2, 2010"

.qdate.resolve

Parses a string into a timestamp using the given pattern.

Parameters:

Name Type Description
fmt string Format string describing the organization of the input pattern. This format string should combine identifier tokens to describe the format of an   input date string.
dates string | string[] String dates to convert to q date types

Returns:

Type Description
timestamp | timestamp[]

Example: Parsing dates

 dates: 2 _/: ssr[;".";"/"] each string 1000?.z.d
 /=> "06/10/18"
 /=> "17/11/07"
 /=> "03/12/26"
 /=> ..

 .qdate.resolve["%y/%m/%d"] dates
 /=> 2006.10.18D00:00:00.000000000 
 /=> 2017.11.07D00:00:00.000000000
 /=> 2003.12.26D00:00:00.000000000
 /=> ..

Example: Parsing times

 times: string "t"$1000?.z.p
 /=> "19:49:48.080"
 /=> "01:56:58.202"
 /=> "19:40:23.195"
 /=> ..

 .qdate.resolve["%H:%M:%S.%i"] times
 /=> 0D19:49:48.080000000
 /=> 0D01:56:58.202000000
 /=> 0D19:40:23.195000000
 /=> ..

.qdate.resolveAs

Parses string formatted dates using a pattern identifier string. The output is then converted to a provided temporal type.

Parameters:

Name Type Description
dt symbol Temporal data type to output, one of: `timestamp`month`date`datetime`timespan`minute`second`time
fmt string Format string describing the organization of the input pattern. This format string should combine identifier tokens to describe the format of an   input date string.
dates string | string[] String dates to convert to q date types

Returns:

Type Description
.qdate.temporal | .qdate.temporal []

See Also: .qdate.resolve