![見出し画像](https://assets.st-note.com/production/uploads/images/56302508/rectangle_large_type_2_6c9441052e8fa17bbc8d748dec8f13f6.png?width=1200)
Notes C API探訪: ConvertTIMEDATEToText(関数)
ConvertTIMEDATEToText関数は、TIMEDATE型変数に格納されている日時データを、フォーマット情報を元にテキストにします。
#include <misc.h>
STATUS LNPUBLIC ConvertTIMEDATEToText (
const void far *IntlFormat,
const TFMT far *TextFormat,
const TIMEDATE far *InputTime,
char far *retTextBuffer,
WORD TextBufferLength,
WORD far *retTextLength);
IntlFormatは、国際化フォーマットに関する構造体INTLFORMATのデータを指定します。ヌルポインタを指定するとデフォルト値が使用されます。
TextFormatは、出力するパートを選択する構造体TFMTのデータを指定します。ヌルポインタを指定するとデフォルト値が使用されます。
InputTimeは、テキストに変換したい日時データを指定します。
retTextBufferとTextBufferLengthは、出力先となる文字列へのポインタとそのサイズを指定します。通常、MAXALPHATIMEDATE定数+1のバッファを用意します。
retTextLengthは、実際に出力先の文字列に書き込まれた文字列のサイズが返ります。
戻り値はSTATUS型で、失敗した時はNOERROR値以外になります。
INTLFORMAT
INTLFORMAT構造体は、国際化に関するフォーマット情報で日時の他に通貨に関する情報も含まれています。
#include <intl.h>
// Flags
#define CURRENCY_SUFFIX 0x0001
#define CURRENCY_SPACE 0x0002
#define NUMBER_LEADING_ZERO 0x0004
#define CLOCK_24_HOUR 0x0008
#define DAYLIGHT_SAVINGS 0x0010
#define DATE_MDY 0x0020
#define DATE_DMY 0x0040
#define DATE_YMD 0x0080
#define DATE_4DIGIT_YEAR 0x0100
#define TIME_AMPM_PREFIX 0x0400
#define DATE_ABBREV 0x0800
// String size
#define ISTRMAX 5
#define YTSTRMAX 32
typedef struct {
WORD Flags; // Flags (see above)
BYTE CurrencyDigits;
BYTE Length; // Length of this structure THIS MUST BE SET TO THE EXACT SIZE OF THE STRUCTURE WHEN ITS POINTER IS PASSED AS AN ARGUMENT
int TimeZone;
char AMString[ISTRMAX];
char PMString[ISTRMAX];
char CurrencyString[ISTRMAX];
char ThousandString[ISTRMAX];
char DecimalString[ISTRMAX];
char DateString[ISTRMAX];
char TimeString[ISTRMAX];
char YesterdayString[YTSTRMAX];
char TodayString[YTSTRMAX];
char TomorrowString[YTSTRMAX];
} INTLFORMAT;
通常、このフォーマット情報は一から設定する必要はなく、OSGetIntlSettings関数でデフォルト情報を取得し、必要な箇所だけ変更するようにします。
#include <misc.h>
void LNPUBLIC OSGetIntlSettings(
INTLFORMAT far *retIntlFormat,
WORD BufferSize);
日本語環境の場合、デフォルトでは以下のような設定値になります。
INTLFORMAT size: 139
Flags: 18c
> CURRENCY_SUFFIX: false
> CURRENCY_SPACE: false
> NUMBER_LEADING_ZERO: true
> CLOCK_24_HOUR: true
> DAYLIGHT_SAVINGS: false
> DATE_MDY: false
> DATE_DMY: false
> DATE_YMD: true
> DATE_4DIGIT_YEAR: true
> TIME_AMPM_PREFIX: false
> DATE_ABBREV: false
CurrencyDigits: 0
Length: 139
TimeZone: -9
AMString: AM
PMString: PM
CurrencyString: ¥
ThousandString: ,
DecimalString: .
DateString: /
TimeString: :
YesterdayString: 昨日
TodayString: 今日
TomorrowString: 明日
なお、ConvertTIMEDATEToText関数でIntlFormat引数にヌルポインタを渡すと、OSGetIntlSettings関数から取得したこのデフォルトのフォーマット情報が利用されています。
TFMT
TFMT構造体は、日時を出力する際にどこを見せて、何を見せないかを定義します。
#include <misc.h>
typedef struct {
BYTE Date; /* Date Display Format */
BYTE Time; /* Time Display Format */
BYTE Zone; /* Time Zone Display Format */
BYTE Structure; /* Overall Date/Time Structure */
} TFMT;
Dateは日付に関しての表示、非表示を示します。TDFMT_FULLがデフォルトです。
#include <misc.h>
#define TDFMT_FULL 0 /* year, month, and day */
#define TDFMT_CPARTIAL 1 /* month and day, year if not this year */
#define TDFMT_PARTIAL 2 /* month and day */
#define TDFMT_DPARTIAL 3 /* year and month */
#define TDFMT_FULL4 4 /* year(4digit), month, and day */
#define TDFMT_CPARTIAL4 5 /* month and day, year(4digit) if not this year */
#define TDFMT_DPARTIAL4 6 /* year(4digit) and month */
Timeは時刻に関しての表示、非表示を示します。TTFMT_FULLがデフォルトです。
#include <misc.h>
#define TTFMT_FULL 0 /* hour, minute, and second */
#define TTFMT_PARTIAL 1 /* hour and minute */
#define TTFMT_HOUR 2 /* hour */
Zoneはタイムゾーンに関しての表示、非表示を示します。TZFMT_NEVERがデフォルトです。
#include <misc.h>
#define TZFMT_NEVER 0 /* all times converted to THIS zone */
#define TZFMT_SOMETIMES 1 /* show only when outside this zone */
#define TZFMT_ALWAYS 2 /* show on all times, regardless */
Structureは全体の構造に関して表示、非表示を示します。TSFMT_DATETIMEがデフォルトです。
#include <misc.h>
#define TSFMT_DATE 0 /* DATE */
#define TSFMT_TIME 1 /* TIME */
#define TSFMT_DATETIME 2 /* DATE TIME */
#define TSFMT_CDATETIME 3 /* DATE TIME or TIME Today or TIME Yesterday */
なお、ConvertTIMEDATEToText関数でTextFormat引数にヌルポインタを渡すと、各設定値のデフォルトが適用されます。
ConvertTextToTIMEDATE
ConvertTextToTIMEDATE関数は、フォーマットに準じた日時の文字列を日時データに変換します。
#include <misc.h>
STATUS LNPUBLIC ConvertTextToTIMEDATE (
const void far *IntlFormat,
const TFMT far *TextFormat,
char far * far *Text,
WORD MaxLength,
TIMEDATE far *retTIMEDATE);
IntlFormatとTextFormatはConvertTIMEDATEToTextと同じです。
TextとMaxLengthにフォーマット化された日時文字列とその長さを指定します。
retTIMEDATEにTIMEDATE変数へのポインタを指定します。
まとめ
Notes/Dominoの日時データに関するトピックを4回に分けて紹介しました。この他にもユリウス日との相互変換用関数や、Tick値(=10ms)に関する便利な定義、TIMEDATE_PAIR型の存在などがあります。TIMEDATE_PAIR型については、複数値についての探訪でご紹介できると思っています。振り返れば、関数の戻り値がTRUEとFALSEで真逆の意味を持ったり、最小単位がミリ秒ではなく10ミリ秒であったり、フォーマットにも独特の仕様があったりと、なかなかクセが強い印象でした。フォーマットについては、Notes/Dominoの「@関数」に精通している人であれば、@Text関数がこの仕様を受け継いでいる、というか引きずっている印象を持つかもしれませんね。