Показать сообщение отдельно
Старый 06.03.2007, 17:53   #20  
EVGL is offline
EVGL
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,715 / 2257 (83) +++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Post
Я постарался улучшить код, избавив его от указанных недостатков.
X++:
static container now()
{
    #define.KernelDLL('KERNEL32')
    #define.SizeOfStructure(8*4)

    Binary      systemtime = new Binary(#SizeOfStructure);
    DLL         _DLL          = new DLL(#KernelDLL);
    DLLFunction _GetSystemTime = new DLLFunction(_DLL, 'GetLocalTime');

    int         wYear;
    int         wMonth;
    int         wDayOfWeek;
    int         wDay;
    int         wHour;
    int         wMinute;
    int         wSecond;
    int         wMilliseconds;

    date        resDate;
    TimeOfDay   resTime;


    _GetSystemTime.arg(ExtTypes::Pointer);

    _GetSystemTime.call(systemtime);

    wYear   = systemtime.word(0);
    wMonth  = systemtime.word(2);
    wDay    = systemtime.word(6);

    resDate = mkdate(wDay, wMonth, wYear);

    wHour   = systemtime.word(8);
    wMinute = systemtime.word(10);
    wSecond = systemtime.word(12);

    resTime = wSecond + (wMinute + wHour*60)*60;

    info(strFmt("%1 %2", resDate, time2str(resTime, -1, -1)));

    return [resDate, resTime];
}
К сожалению, он возвращает время Coordinated Universal Time (UTC), т.е. для Гринвичского меридиана. Буду рад, если кто-нибудь продолжит работу и скорректирует код с учетом временной зоны.

P.S. Исправил: надо было успользовать функцию GetLocalTime вместо GetSystemTime.

Как нетрудно видеть, код в итоге стал не менее компактным, зато более доступным и понятным.

Последний раз редактировалось EVGL; 06.03.2007 в 18:03.