Formats for Date Time and DateTime properties
- Last Updated: June 19, 2023
- 6 minute read
- Corticon
- Documentation
DateTime information may take many different formats. Corticon uses a common source of acceptable DateTime, Date Only, and Time Only formats, also known as masks.
For example, a date mask may specify yyyy-MM-dd as an acceptable date format, which means that an attribute of
type DateTime (or Date) may hold or contain data that conforms to this format. '2019-04-12' conforms to this mask; 'April 12th,2019' does not.
For proper execution, it is important to ensure that date formats used
during rule development and testing (and are included in the rule builders' Corticon Studio
brms.properties file) are also present in the Corticon Server's brms.properties file.
Most commercial databases represent dates as DateTimes. Such DateTimes are frequently stored as UTC, namely the number of milliseconds that have transpired from an arbitrary epoch (for example, 1/1/1970 00:00:00 GMT); this is not a universal standard but is a very popular convention. UTC dates can be rendered in the user's local time zone, but this is merely a matter of presentation. A UTC represents a simultaneous point in time for two observers regardless of where on earth they reside.
However, some date or time concepts, such as holiday, cannot be expressed conveniently as a discrete time point. Christmas (12/25/XX) actually denotes different time frames depending on the observers' time zones; thus, Corticon carries (that is, holds in memory) all dates in GMT with the time portion zeroed (that is, midnight). This approach addresses the holiday problem because a user can enter holiday dates into the database and not have them shift when they are rendered in the user's local time zone.
Carrying GMT dates should be transparent to the user. Dates expressed as strings in incoming requests are parsed and the proper data type is inferred; for dates, they are immediately instantiated as GMT and rendered back in GMT with no conversion.
Setting and modifying masks
Date/time masks are stored as a set of defaults that can be replaced by
listing preferred values in the brms.properties file
located at your work directory root – or, in Studio, the preferred location specified in
Preferences.Corticon Studio's DateTime datatype
uses both date and time data. The Date datatype
handles only date information, and the Time datatype
handles only time information.
The Corticon Translator will
maintain the consistency of DateTime, Date, and Time values
from input to output documents as long as the masks that are used are contained in the
lists.
brms.properties do not append to an existing list, they replace the default
values. For example, if you want to add a new DateTime
mask to the built-in list, be sure to include all the masks you intend to use, not just
the new one. If your brms.properties file contains
only the new mask, then it will be the only mask Corticon uses.There is only one Date datatype. It handles dates, times, and date/times. A Date attribute is designated as date, time, or date/time depending on which of the masks below are matched. This designation changes the behavior of Date comparison operators.
The dateformat, timeformat, and datetimeformat, Date
masks process incoming date/times on request payloads, insert date/times into output
response payloads, parse entries made in the Studio Rulesheets, Vocabulary, and
Testsheets, and to display any date/time in Studio.
The first entry for each dateformat,
datetimeformat, and timeformat is the default mask. For example, the built-in operator today always returns the current date in the default
dateformat mask.
The function now returns the current
date in the default datetimeformat.The entries can be
altered but must conform to the patterns/masks supported by the Java class SimpleDateFormat in the java.text package.
com.corticon.crml.OclDate.dateformat=
MM/dd/yy
MM/dd/yyyy
M/d/yy
M/d/yyyy
yyyy/MM/dd
yyyy-MM-dd
yyyy/M/d
yy/MM/dd
yy/M/d
MMM d, yyyy
MMMMM d, yyyy
com.corticon.crml.OclDate.datetimeformat=
MM/dd/yy h:mm:ss a
MM/dd/yyyy h:mm:ss a
M/d/yy h:mm:ss a
M/d/yyyy h:mm:ss a
yyyy/MM/dd h:mm:ss a
yyyy/M/d h:mm:ss a
yy/MM/dd h:mm:ss a
yy/M/d h:mm:ss a
MMM d, yyyy h:mm:ss a
MMMMM d, yyyy h:mm:ss a
MM/dd/yy H:mm:ss
MM/dd/yyyy H:mm:ss
M/d/yy H:mm:ss
M/d/yyyy H:mm:ss
yyyy/MM/dd H:mm:ss
yyyy/M/d H:mm:ss
yy/MM/dd H:mm:ss
yy/M/d H:mm:ss
MMM d, yyyy H:mm:ss
MMMMM d, yyyy H:mm:ss
MM/dd/yy hh:mm:ss a
MM/dd/yyyy hh:mm:ss a
M/d/yy hh:mm:ss a
M/d/yyyy hh:mm:ss a
yyyy/MM/dd hh:mm:ss a
yyyy/M/d hh:mm:ss a
yy/MM/dd hh:mm:ss a
yy/M/d hh:mm:ss a
MMM d, yyyy hh:mm:ss a
MMMMM d, yyyy hh:mm:ss a
MM/dd/yy HH:mm:ss
MM/dd/yyyy HH:mm:ss
M/d/yy HH:mm:ss
M/d/yyyy HH:mm:ss
yyyy/MM/dd HH:mm:ss
yyyy/M/d HH:mm:ss
yy/MM/dd HH:mm:ss
yy/M/d HH:mm:ss
MMM d, yyyy HH:mm:ss
MMMMM d, yyyy HH:mm:ss
MM/dd/yy h:mm:ss a z
MM/dd/yyyy h:mm:ss a z
M/d/yy h:mm:ss a z
M/d/yyyy h:mm:ss a z
yyyy/MM/dd h:mm:ss a z
yyyy/M/d h:mm:ss a z
yy/MM/dd h:mm:ss a z
yy/M/d h:mm:ss a z
MMM d, yyyy h:mm:ss a z
MMMMM d, yyyy h:mm:ss a z
MM/dd/yy H:mm:ss z
MM/dd/yyyy H:mm:ss z
M/d/yy H:mm:ss z
M/d/yyyy H:mm:ss z
yyyy/MM/dd H:mm:ss z
yyyy/M/d H:mm:ss z
yy/MM/dd H:mm:ss z
yy/M/d H:mm:ss z
MMM d, yyyy H:mm:ss z
MMMMM d, yyyy H:mm:ss z
MM/dd/yy hh:mm:ss a z
MM/dd/yyyy hh:mm:ss a z
M/d/yy hh:mm:ss a z
M/d/yyyy hh:mm:ss a z
yyyy/MM/dd hh:mm:ss a z
yyyy/M/d hh:mm:ss a z
yy/MM/dd hh:mm:ss a z
yy/M/d hh:mm:ss a z
MMM d, yyyy hh:mm:ss a z
MMMMM d, yyyy hh:mm:ss a z
MM/dd/yy HH:mm:ss z
MM/dd/yyyy HH:mm:ss z
M/d/yy HH:mm:ss z
M/d/yyyy HH:mm:ss z
yyyy/MM/dd HH:mm:ss z
yyyy/M/d HH:mm:ss z
yy/MM/dd HH:mm:ss z
yy/M/d HH:mm:ss z
MMM d, yyyy HH:mm:ss z
MMMMM d, yyyy HH:mm:ss z
com.corticon.crml.OclDate.timeformat=
h:mm:ss a
h:mm:ss a z
H:mm:ss
H:mm:ss z
hh:mm:ss a
hh:mm:ss a z
HH:mm:ss
HH:mm:ss z
------------------------------------------------------------
When com.corticon.crml.OclDate.locale=true, it will override the default
datetime mask and use the locale mask as the date style type defined by com.corticon.crml.OclDate.datetype and the time style type
defined by com.corticon.crml.OclDate.timetypevalue for
datetype and are defined as values of timetypejava.text.DateFormat enums: FULL =
0, LONG = 1, MEDIUM = 2, SHORT = 3 .
com.corticon.crml.OclDate.locale=false
com.corticon.crml.OclDate.datetype=3
com.corticon.crml.OclDate.timetype=2
------------------------------------------------------------
If permissive is true (default), then
the Corticon date/time parser will be
lenient when handling incoming or entered date/times, trying to find a match even if the
pattern is not contained in the mask lists. If false, then any incoming or entered
date/time must strictly adhere to the patterns defined by dateformat, datetimeformat, timeformat.
Default patterns are for United States and other countries that follow the US conventions on date/times.
com.corticon.crml.OclDate.permissive =true
------------------------------------------------------------
now is
pinned, the milliseconds are set to zero. This property can specify how to deal with the
nano seconds (which can affect the milliseconds). - Value of
ZERO_MILLISsets the nanos to 0 (which also sets milliseconds to zero) - Value of
ZERO_NANOSsets only the last 3 digits of the nanos to zero (which does not modify millis) - Value of
NO_ZEROdoes not modify the nanos (This has shown some rare side effects where datetime appears equal however the hidden nanos values cause comparison to be not equal)
Default value is ZERO_MILLIS
com.corticon.crml.OclDate.nanos=ZERO_MILLIS
------------------------------------------------------------
If maskliterals is true (default),
the system will parse strings and dates more quickly by checking for the presence of
mask literals (for example, “/”, “-”, “:” or “,”) before consulting the date masks
(an expensive process). If a string does not contain any of the mask literal characters,
it can be immediately deemed a string (as opposed to a date).
com.corticon.crml.OclDate.maskliterals =true
------------------------------------------------------------
When a Date literal contains time zone information, it may cause a
shift in the actual day because internally Corticon expects Date literals to have a time
component of 00:00:00 GMT.By setting com.corticon.crml.OclDate.ignoreTimeZoneOnDate=true, the
time component is ignored when converting a string into a Date literal. The result is an
internal value that has a time component of 00:00:00
GMT which normalizes the Date literal. Default value is false.
com.corticon.crml.OclDate.ignoreTimeZoneOnDate =true
Mask patterns
To take advantage of this feature, all user-specified date masks must
contain at least one literal character. If any user-specified masks contain exclusively
date pattern characters (for example, 'MMddyy'), maskliterals must be set to false in order to prevent the system
from misinterpreting date literals (for example, '123199') as simple strings.
These properties deal with the way Corticon Studio and Corticon Server handle date/time formats. Preset formats -- referred to as masks - are used to:
- Process incoming date/times on request payloads.
- Insert date/times into output response payloads.
- Parse entries made in the Corticon Studio Rulesheets, Vocabulary, and Tests.
- To display any date/time in Corticon Studio.
Masks are divided into 3 categories: dateformat, datetimeformat, timeformat.
Use the following chart to decode the date mask formats:
The following symbols are used in date/time masks:
| Symbol | Meaning | Presentation | Patterns |
|---|---|---|---|
G |
Era designator | Text | G = {AD, BC} |
y |
Year | Number | yy = {00..99} yyyy = {0000..9999} |
Y |
Week year | Number | YY = {00..99} YYYY = {0000..9999} |
M |
Month in year | Text or Number | M = {1..12} MM = {01..12}MMM = {Jan..Dec} MMMM = {January..December} |
w |
Week in year | Number | w = {1..53} ww = {01..53} |
W |
Week in month | Number | W = {1..6} |
D |
Day in year | Number | D = {0..366} DDD = {000..366} |
d |
Day in month | Number | d = {1..31} dd = {01..31} |
F |
Day of week in month | Number | F = {0..6} |
E |
Day name in week | Text | E, EE, or EEE = {Sun..Sat} EEEE = {Sunday..Saturday} |
u |
Day number of week (1 = Monday, ..., 7 = Sunday) | Number | u = {1..7} |
a |
AM/PM marker | Text | a = {AM, PM} |
H |
Hour in 24-hour format (0-23) | Number | H = {0..23} HH = {00..23} |
k |
Hour in day (1-24) | Number | k = {1..24} kk = {01..24} |
K |
Hour in AM/PM (0-11) | Number | K = {1..12} KK = {01..12} |
h |
Hour in AM or PM | Number | h = {1..12} hh = {01..12} |
m |
Minute in hour | Number | m = {0..59} mm = {00..59} |
s |
Second in minute | Number | s = {0..59} ss = {00..59} |
S |
Millisecond in minute | Number | S = {0..999} SSS = {000..999} |
z |
General time zone | Text | z, zz, or zzz = abbreviated time zone zzzz = full time zone |
Z |
RFC 822 time zone | Text | Z,ZZ, or ZZZ = abbreviated time zone ZZZZ = full time zone |
X |
ISO 8601 time zone | Text | X, XX, or XXX = abbreviated time zone XXXX = full time zone |
` |
escape character used to insert text | Delimiter | |
' |
single quote | Literal | ' |
Any characters in the pattern that are not in the ranges of [a..z] and [A..Z] will be treated as quoted text. For instance, characters like {:, ., <space>, #, @} will appear in the resulting time text even they are not embraced within single quotes. A pattern containing any invalid pattern letter will result in a thrown exception during formatting or parsing.
Examples:
| Sample Pattern | Resulting Formatted Date |
|---|---|
yyyy.MM.dd G 'at' hh:mm:ss
z |
2013.07.10 AD at 15:08:56 PDT |
EEE, MMM d,
''yy |
Wed, Jul 10, '13 |
h:mm a |
12:08 PM |
hh 'o''clock' a,
zzzz |
12 o'clock PM, Pacific Daylight Time |
K:mm a, z |
0:00 PM, PST |
yyyy.MMMM.dd G h:mm
a |
2013.July.10 AD 12:08 PM |