|
OpenVMS Programming Concepts Manual
27.6.2 Selecting a Format
There are two methods by which date/time input and output formats can
be selected:
- The language and format are determined at run time through the
translation of the logical names SYS$LANGUAGE, LIB$DT_FORMAT, and
LIB$DT_INPUT_FORMAT.
- The language and format are programmable at compile time through
the use of the LIB$INIT_DATE_TIME_CONTEXT routine.
In general, if an application accepts text from a user or formats text
for presentation to a user, you should use the logical name method of
specifying language and format. With this method, the user assigns
equivalence names to the logical names SYS$LANGUAGE, LIB$DT_FORMAT, and
LIB$DT_INPUT_FORMAT, thereby selecting the language and input or output
format of the date and time at run time.
If an application reads text from internal storage or formats text for
internal storage or transmission, the language and format should be
specified at compile time. If this is the case, the routine
LIB$INIT_DATE_TIME_CONTEXT specifies the language and format of choice.
27.6.2.1 Formatting Run-Time Mnemonics
The format mnemonics listed in Table 27-6 define both input and
output formats at run time.
Table 27-6 Format Mnemonics
Date |
Explanation |
!D0
|
Day; zero-filled
|
!DD
|
Day; no fill
|
!DB
|
Day; blank-filled
|
!WU
|
Weekday; uppercase
|
!WAU
|
Weekday; abbreviated, uppercase
|
!WC
|
Weekday; capitalized
|
!WAC
|
Weekday; abbreviated, capitalized
|
!WL
|
Weekday; lowercase
|
!WAL
|
Weekday; abbreviated, lowercase
|
!MAU
|
Month; alphabetic, uppercase
|
!MAAU
|
Month; alphabetic, abbreviated, uppercase
|
!MAC
|
Month; alphabetic, capitalized
|
!MAAC
|
Month; alphabetic, abbreviated, capitalized
|
!MAL
|
Month; alphabetic, lowercase
|
!MAAL
|
Month; alphabetic, abbreviated, lowercase
|
!MN0
|
Month; numeric, zero-filled
|
!MNM
|
Month; numeric, no fill
|
!MNB
|
Month; numeric, blank-filled
|
!Y4
|
Year; 4 digits
|
!Y3
|
Year; 3 digits
|
!Y2
|
Year; 2 digits
|
!Y1
|
Year; 1 digit
|
!Z4
|
Year; 4 digits
|
!Z3
|
Year; 3 digits
|
!Z2
|
Year; 2 digits (see LIB$CONVERT_DATE_STRING)
|
!Z1
|
Year; 1 digit
|
Time |
Explanation |
!H04
|
Hours; zero-filled, 24-hour clock
|
!HH4
|
Hours; no fill, 24-hour clock
|
!HB4
|
Hours; blank-filled, 24-hour clock
|
!H02
|
Hours; zero-filled, 12-hour clock
|
!HH2
|
Hours; no fill, 12-hour clock
|
!HB2
|
Hours; blank-filled, 12-hour clock
|
!M0
|
Minutes; zero-filled
|
!MM
|
Minutes; no fill
|
!MB
|
Minutes; blank-filled
|
!S0
|
Seconds; zero-filled
|
!SS
|
Seconds; no fill
|
!SB
|
Seconds; blank-filled
|
!C7
|
Fractional seconds; 7 digits
|
!C6
|
Fractional seconds; 6 digits
|
!C5
|
Fractional seconds; 5 digits
|
!C4
|
Fractional seconds; 4 digits
|
!C3
|
Fractional seconds; 3 digits
|
!C2
|
Fractional seconds; 2 digits
|
!C1
|
Fractional seconds; 1 digit
|
!MIU
|
Meridiem indicator; uppercase
|
!MIC
|
Meridiem indicator; capitalized (mixed case)
|
!MIL
|
Meridiem indicator; lowercase
|
27.6.2.2 Specifying Formats at Run Time
If an application accepts text from a user or formats text for
presentation to a user, you should use the logical name method of
specifying language and format. With this method, the user assigns
equivalence names to the logical names SYS$LANGUAGE, LIB$DT_FORMAT, and
LIB$DT_INPUT_FORMAT, thereby selecting the language and format of the
date and time at run time. LIB$DT_INPUT_FORMAT must be defined using
the mnemonics listed in Table 27-6. The possible choices for
SYS$LANGUAGE and LIB$DT_FORMAT are defined in the
SYS$MANAGER:LIB$DT_STARTUP.COM command procedure that is executed by
the system manager before using these routines.
The following actions occur when any translation of a logical name
fails:
- If the translation of SYS$LANGUAGE or any logical name relating to
text fails, then English is used and a status of LIB$_ENGLUSED is
returned.
- If the translation of LIB$DT_FORMAT, LIB$DT_INPUT_FORMAT, or any
logical name relating to format fails, the operating system standard
(SYS$ASCTIM) representation of the date and time is used, that is,
dd-MMM-yyyy hh:mm:ss.cc, and a status of LIB$_DEFFORUSE is
returned.
Since English is the default language and must therefore always be
available, English spellings are not taken from logical name
translations, but rather are looked up in an internal table.
27.6.2.3 Specifying Input Formats at Run Time
Using the logical name LIB$DT_INPUT_FORMAT, you can define your own
input format at run time using the mnemonics listed in Table 27-6.
Once an input format is defined, any dates or times that are input to
the application are parsed against this format. For example:
$ DEFINE LIB$DT_INPUT_FORMAT -
_$ "!MAU !DD, !Y4 !H02:!M0:!S0:!C2 !MIU"
|
A valid input date string would be as follows:
JUNE 15, 1993 08:45:06:50 PM
|
If the user has selected a language other than English, then the
translation of SYS$LANGUAGE is used by the parser to recognize
alphabetic months and meridiem indicators in the selected language.
Input Format String
The input format string used to define the input date/time format must
contain at least the first seven of the following eight fields:
- Month (either alphabetic or numeric)
- Day of the month (numeric)
- Year (from 1 to 4 digits)
- Hour (12- or 24-hour clock)
- Minute of the hour
- Second of the minute
- Fractional seconds
- Meridiem indicator (required for 12-hour clock; illegal for 24-hour
clock)
If the input format string specifies a 24-hour clock, the string
contains only the first seven fields in the preceding list. If a
12-hour clock is specified, the eighth field (the meridiem indicator)
is required.
The format string fields must appear in two groups: one for date and
one for time (date and time fields cannot be intermixed within a
group). For the input format, alphabetic case distinctions and
abbreviation-specific codes have no significance. For example, the
following format string specifies that the month name will be uppercase
and spelled out in full:
!MAU !DD, !Y4 !H02:!M0:!S0:!C2 !MIU
|
If the input string corresponding to this format string contains a
month name that is abbreviated and lowercase, the parse of the input
string still works correctly. For example:
feb 25, 1988 04:39:02:55 am
|
If this input string is entered, the parse still recognizes
"feb" as the month name and "am" as the meridiem
indicator, even though the format string specified both of these fields
as uppercase, and the month name as unabbreviated.
Punctuation in the Format and Input Strings
One important aspect to consider when formatting date/time input
strings is punctuation. The punctuation referred to here is the
characters that separate the various date/time fields or the date and
time groups. Punctuation in these strings is important because it is
used as an outline for the parser, allowing the parser to synchronize
the input fields to the format fields.
There are three distinct classes of punctuation:
- None Although it is common for no punctuation to begin or end an
input format string, you can specify a date/time format that also has
no punctuation between the fields or groups of the format string. If
this is the case, the corresponding input string must not have any
punctuation between the respective fields or groups, although white
space (see the next item in this list) may appear at the beginning or
end of the input string.
- White space White space includes any combination of spaces and
tabs. In the interpretation of the format string, any white space is
condensed to a single space. When parsing an input string, white space
is generally noted as synchronizing punctuation and is skipped;
however, white space is significant in some situations, such as with
blank-filled numbers.
- Explicit Explicit punctuation refers to any string of one or more
characters that is used as punctuation and is not solely comprised of
white space. Any white space appearing within an explicit punctuation
string is interpreted literally; in other words, the white space is not
compressed. In the format string, you can use explicit punctuation to
denote a particular format and to guide the parser in parsing the input
string. In the input string, you can use explicit punctuation to
synchronize the parse of the input string against the format string.
The explicit punctuation used should not be a subset of the valid input
of any field that it precedes or follows it.
Punctuation is especially important in providing guidelines for the
parser to translate the input date/time string properly.
Default Date/Time Fields
Punctuation in a date/time string is also useful for specifying which
fields you want to omit in order to accept the default values. That is,
you can control the parsing of the input string by supplying
punctuation without the appropriate field values. If only the
punctuation is supplied and a user-supplied default is not specified,
the value of the omitted field defaults according to the following
rules:
- For the date group, the default is the current date.
- For the time group, the default is 00:00:00.00.
Table 27-7 gives some examples of input strings (using punctuation
to indicate defaulted fields) and their full translations (assuming a
current date of 25-FEB-1993 and using the default input format).
Table 27-7 Input String Punctuation and Defaults
Input |
Full Date/Time Input String |
31
|
31-FEB-1993 00:00:00.00
|
-MAR
|
25-MAR-1993 00:00:00.00
|
-SEPTEMBER
|
25-SEP-1993 00:00:00.00
|
-1993
|
25-FEB-1993 00:00:00.00
|
23:
|
25-FEB-1993 23:00:00.00
|
:45:
|
25-FEB-1993 00:45:00.00
|
::23
|
25-FEB-1993 00:00:23.00
|
.01
|
25-FEB-1993 00:00:00.01
|
Note on the Changing Century
Because the default is the current date for the date group, if you
specify a value of 00 with the !Y2 format, the year is interpreted as
1900. After January 1, 2000, the value 00 will be interpreted as 2000.
For example, 02/29/00 is interpreted as 29-FEB-1900, which results in
LIB$_INVTIME because 1900 is not a leap year. After the turn of the
century (the year 2000), 02/29/00 will be 29-FEB-2000, which is a valid
date because 2000 is a leap year.
27.6.2.4 Specifying Output Formats at Run Time
If the logical name method is used to specify an output format at run
time, the translations of the logical names SYS$LANGUAGE and
LIB$DT_FORMAT specify one or more executive mode logical names which in
turn must be translated to determine the actual format string. These
additional logical names supply such things as the names of the days of
the week and the months in the selected language (as determined by
SYS$LANGUAGE). All of these logicals are predefined, so that a
nonprivileged user can select any one of these languages and formats.
In addition, a user can create his or her own languages and formats;
however, the CMEXEC, SYSNAM and SYSPRV privileges are required.
To select a particular format for a date or time, or both, you must
define the LIB$DT_FORMAT logical name using the following:
- LIB$DATE_FORMAT_nnn, where nnn ranges from 001 to
040
- LIB$TIME_FORMAT_nnn, where nnn ranges from 001 to
020
The order in which these logical names appear in the definition of
LIB$DT_FORMAT determines the order in which they are output. A single
space is inserted into the output string between the two elements, if
the definition specifies that both are output. For example:
$ DEFINE LIB$DT_FORMAT LIB$DATE_FORMAT_006, LIB$TIME_FORMAT_012
|
This definition causes the date to be output in the specified format,
followed by a space and the time in the specified format, as follows:
Table 27-8 lists all predefined date format logical names, their
formats, and examples of the output generated using those formats. (The
mnemonics used to specify the formats are listed in Table 27-6.)
Table 27-8 Predefined Output Date Formats
Date Format Logical Name |
Format |
Example |
LIB$DATE_FORMAT_001
|
!DB-!MAAU-!Y4
|
13-JAN-1993
|
LIB$DATE_FORMAT_002
|
!DB !MAU !Y4
|
13 JANUARY 1993
|
LIB$DATE_FORMAT_003
|
!DB.!MAU !Y4
|
13.JANUARY 1993
|
LIB$DATE_FORMAT_004
|
!DB.!MAU.!Y4
|
13.JANUARY.1993
|
LIB$DATE_FORMAT_005
|
!DB !MAU !Y2
|
13 JANUARY 93
|
LIB$DATE_FORMAT_006
|
!DB !MAAU !Y2
|
13 JAN 93
|
LIB$DATE_FORMAT_007
|
!DB.!MAAU !Y2
|
13.JAN 93
|
LIB$DATE_FORMAT_008
|
!DB.!MAAU.!Y2
|
13.JAN.93
|
LIB$DATE_FORMAT_009
|
!DB !MAAU !Y4
|
13 JAN 1993
|
LIB$DATE_FORMAT_010
|
!DB.!MAAU !Y4
|
13.JAN 1993
|
LIB$DATE_FORMAT_011
|
!DB.!MAAU.!Y4
|
13.JAN.1993
|
LIB$DATE_FORMAT_012
|
!MAU !DD, !Y4
|
JANUARY 13, 1993
|
LIB$DATE_FORMAT_013
|
!MN0/!D0/!Y2
|
01/13/93
|
LIB$DATE_FORMAT_014
|
!MN0-!D0-!Y2
|
01-13-93
|
LIB$DATE_FORMAT_015
|
!MN0.!D0.!Y2
|
01.13.93
|
LIB$DATE_FORMAT_016
|
!MN0 !D0 !Y2
|
01 13 93
|
LIB$DATE_FORMAT_017
|
!D0/!MN0/!Y2
|
13/01/93
|
LIB$DATE_FORMAT_018
|
!D0/!MN0-!Y2
|
13/01-93
|
LIB$DATE_FORMAT_019
|
!D0-!MN0-!Y2
|
13-01-93
|
LIB$DATE_FORMAT_020
|
!D0.!MN0.!Y2
|
13.01.93
|
LIB$DATE_FORMAT_021
|
!D0 !MN0 !Y2
|
13 01 93
|
LIB$DATE_FORMAT_022
|
!Y2/!MN0/!D0
|
93/01/13
|
LIB$DATE_FORMAT_023
|
!Y2-!MN0-!D0
|
93-01-13
|
LIB$DATE_FORMAT_024
|
!Y2.!MN0.!D0
|
93.01.13
|
LIB$DATE_FORMAT_025
|
!Y2 !MN0 !D0
|
93 01 13
|
LIB$DATE_FORMAT_026
|
!Y2!MN0!D0
|
930113
|
LIB$DATE_FORMAT_027
|
/!Y2.!MN0.!D0
|
/93.01.13
|
LIB$DATE_FORMAT_028
|
!MN0/!D0/!Y4
|
01/13/1993
|
LIB$DATE_FORMAT_029
|
!MN0-!D0-!Y4
|
01-13-1993
|
LIB$DATE_FORMAT_030
|
!MN0.!D0.!Y4
|
01.13.1993
|
LIB$DATE_FORMAT_031
|
!MN0 !D0 !Y4
|
01 13 1993
|
LIB$DATE_FORMAT_032
|
!D0/!MN0/!Y4
|
13/01/1993
|
LIB$DATE_FORMAT_033
|
!D0-!MN0-!Y4
|
13-01-1993
|
LIB$DATE_FORMAT_034
|
!D0.!MN0.!Y4
|
13.01.1993
|
LIB$DATE_FORMAT_035
|
!D0 !MN0 !Y4
|
13 01 1993
|
LIB$DATE_FORMAT_036
|
!Y4/!MN0/!D0
|
1993/01/13
|
LIB$DATE_FORMAT_037
|
!Y4-!MN0-!D0
|
1993-01-13
|
LIB$DATE_FORMAT_038
|
!Y4.!MN0.!D0
|
1993.01.13
|
LIB$DATE_FORMAT_039
|
!Y4 !MN0 !D0
|
1993 01 13
|
LIB$DATE_FORMAT_040
|
!Y4!MN0!D0
|
19930113
|
Table 27-9 lists all predefined time format logical names, their
formats, and examples of the output generated using those formats.
Table 27-9 Predefined Output Time Formats
Time Format Logical |
Format |
Example |
LIB$TIME_FORMAT_001
|
!H04:!M0:!S0.!C2
|
09:13:25.14
|
LIB$TIME_FORMAT_002
|
!H04:!M0:!S0
|
09:13:25
|
LIB$TIME_FORMAT_003
|
!H04.!M0.!S0
|
09.13.25
|
LIB$TIME_FORMAT_004
|
!H04 !M0 !S0
|
09 13 25
|
LIB$TIME_FORMAT_005
|
!H04:!M0
|
09:13
|
LIB$TIME_FORMAT_006
|
!H04.!M0
|
09.13
|
LIB$TIME_FORMAT_007
|
!H04 !M0
|
09 13
|
LIB$TIME_FORMAT_008
|
!HH4:!M0
|
9:13
|
LIB$TIME_FORMAT_009
|
!HH4.!M0
|
9.13
|
LIB$TIME_FORMAT_010
|
!HH4 !M0
|
9 13
|
LIB$TIME_FORMAT_011
|
!H02:!M0 !MIU
|
09:13 AM
|
LIB$TIME_FORMAT_012
|
!HH2:!M0 !MIU
|
9:13 AM
|
LIB$TIME_FORMAT_013
|
!H04!M0
|
0913
|
LIB$TIME_FORMAT_014
|
!H04H!M0m
|
09H13m
|
LIB$TIME_FORMAT_015
|
kl !H04.!M0
|
kl 09.13
|
LIB$TIME_FORMAT_016
|
!H04H!M0'
|
09H13'
|
LIB$TIME_FORMAT_017
|
!H04.!M0 h
|
09.13 h
|
LIB$TIME_FORMAT_018
|
h !H04.!M0
|
h 09.13
|
LIB$TIME_FORMAT_019
|
!HH4 h !MM
|
9 h 13
|
LIB$TIME_FORMAT_020
|
!HH4 h !MM min !SS s
|
9 h 13 min 25 s
|
|