본 강좌는 누구나 알고 있는 야그들중에 하나입니다.
하지만, 2009년초의 말로 다할수 없는 극히 불미스러운 일때문에 강좌의 옮김이나 펌을 제한합니다.
본강좌는 필자인 저의 허락없이 어디에도 올릴수 없습니다.
제가 잘나서 그런건 아닙니다. 필자의 필명의 무단 남용 및 저작권, 강좌로인한 돈벌이 및 인신공격등에 관한 불미스런일만 없었어도 이렇게 까진 하지 않았을겁니다. 이해해 주시길 바랍니다.
한 1-2주 바빠서 퀀텀의 강좌는 조금 미뤄지고 있습니다.
간만에 후배가 물어온 내용으로 세계의 각 나라마다 시스템의 날짜 Format설정을 어찌 알수 있는가에 대한 질문이었습니다.
뭐 API를 사용해서 읽어 올수도 있고 설정도 가능하지만, 솔직히 구찮지요.
델파이에는 기본적으로 시스템의 날짜와 시간에 대한 포맷을 가지고 있습니다. 즉, 델파이 내부적으로 자체 포맷을 가지고 있다는 말이 됩니다.
SysUtils에 선언된 이변수들은 GetFormatSettings를 이용하여 시스템의기본 설정값을 읽어 온뒤에 그값을 변경하거나 이용할수 있습니다. 함수 원형중 Windows에 해당하는 것만 발췌를 하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
procedure GetFormatSettings; {$IFDEF MSWINDOWS} var HourFormat, TimePrefix, TimePostfix: string; DefaultLCID: Integer; begin InitSysLocale; GetMonthDayNames; if SysLocale.FarEast then GetEraNamesAndYearOffsets; DefaultLCID := GetThreadLocale; CurrencyString := GetLocaleStr(DefaultLCID, LOCALE_SCURRENCY, ''); CurrencyFormat := StrToIntDef(GetLocaleStr(DefaultLCID, LOCALE_ICURRENCY, '0'), 0); NegCurrFormat := StrToIntDef(GetLocaleStr(DefaultLCID, LOCALE_INEGCURR, '0'), 0); ThousandSeparator := GetLocaleChar(DefaultLCID, LOCALE_STHOUSAND, ','); DecimalSeparator := GetLocaleChar(DefaultLCID, LOCALE_SDECIMAL, '.'); CurrencyDecimals := StrToIntDef(GetLocaleStr(DefaultLCID, LOCALE_ICURRDIGITS, '0'), 0); DateSeparator := GetLocaleChar(DefaultLCID, LOCALE_SDATE, '/'); ShortDateFormat := TranslateDateFormat(GetLocaleStr(DefaultLCID, LOCALE_SSHORTDATE, 'm/d/yy')); LongDateFormat := TranslateDateFormat(GetLocaleStr(DefaultLCID, LOCALE_SLONGDATE, 'mmmm d, yyyy')); TimeSeparator := GetLocaleChar(DefaultLCID, LOCALE_STIME, ':'); TimeAMString := GetLocaleStr(DefaultLCID, LOCALE_S1159, 'am'); TimePMString := GetLocaleStr(DefaultLCID, LOCALE_S2359, 'pm'); TimePrefix := ''; TimePostfix := ''; if StrToIntDef(GetLocaleStr(DefaultLCID, LOCALE_ITLZERO, '0'), 0) = 0 then HourFormat := 'h' else HourFormat := 'hh'; if StrToIntDef(GetLocaleStr(DefaultLCID, LOCALE_ITIME, '0'), 0) = 0 then if StrToIntDef(GetLocaleStr(DefaultLCID, LOCALE_ITIMEMARKPOSN, '0'), 0) = 0 then TimePostfix := ' AMPM' else TimePrefix := 'AMPM '; ShortTimeFormat := TimePrefix + HourFormat + ':mm' + TimePostfix; LongTimeFormat := TimePrefix + HourFormat + ':mm:ss' + TimePostfix; ListSeparator := GetLocaleChar(DefaultLCID, LOCALE_SLIST, ','); end; |
보기면 아시겠지만, ShortDateFormat등과 같은 변수들이 system format을 가져옵니다.
요기서 LOCALE_??????????? 와같은 선언인데, 이넘들은 Windows에서 선정되어 있습니다.
굳이 설명을 안해서 주석만 봐도 그내용을 알수 있습니다.
아래는 GetLocalInfo와 SetLocalInfo API 를 이용하여 System의 날짜를 format을 가져와서 설정한뒤에 다시 델파이로 설정한 값을 읽어 오는 예제입니다.
워낙 오래된 코드라 … 사용하기 합니다만, 몇몇 컴포넌트들은 아래 설정을 이용하지 않는 경우가 있습니다.
1 2 3 4 5 6 7 8 9 10 11 |
Get_s : Array [0..30] of Char; .... GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, @Get_S, 30); S := Get_S; If UpperCase(s) <> 'YYYY-MM-DD' Then Begin SetLocaleInfo( LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, 'yyyy-MM-dd'); GetFormatSettings; End; CurrencyString := ''; // 금액을 나타내게 하지 않기 위해.. |
전역변수를 아래와 같이 사용함으로써 프로그램이 전세계 어디를 가던 그나라의 날짜 포맷에 맞게 표현이 됩니다.
1 |
FormatDateTime( ShortDateFormat + ' hh:nn:ss' , Now) |
간단히 델파이 자체의 날짜 포맷을 이용하거나 변경하는 방법에 대해 알아 보았습니다.
이상입니다.
최신 댓글