Я постарался улучшить код, избавив его от указанных недостатков.
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.
Как нетрудно видеть, код в итоге стал не менее компактным, зато более доступным и понятным.