本人根据歼10博主的此博文的思路进行改进,目的是高效的实现FormatDateTime('YYYY-MM-DD HH:NN:SS.ZZZ', Now);
在DelphiXE3 32Bits环境测试10,000,000次,
Delphi自带的FormatDateTime = 20405 ms
歼10的优化函数 = 2683 ms
本文优化函数 = 1851 ms
在DelphiXE3 64Bits环境测试10,000,000次,
Delphi自带的FormatDateTime = 18782 ms
歼10的优化函数 = 2091 ms
本文优化函数 = 1302ms
type
UInt32 = LongWord;
UInt32Array = array[0..0] of UInt32;
PUInt32Array = ^UInt32Array;
PUInt32 = ^UInt32;
PUInt64 = ^UInt64;
UInt64Array = array[0..0] of UInt64;
PUInt64Array = ^UInt64Array;
const
strPatternHandred: PWideChar =
'00010203040506070809101112131415161718192021222324252627282930' +
'313233343536373839404142434445464748495051525354555657585960' +
'6162636465666768697071727374757677787980' +
'81828384858687888990919293949596979899';
strPattern10: PWideChar = '0'#0'1'#0'2'#0'3'#0'4'#0'5'#0'6'#0'7'#0'8'#0'9'#0;
strPatternYear: PWideChar =
'201420152016201720182019202020212022202320242025202620272028202920302031' +
'2032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056' +
'2057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081' +
'2082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106' +
'2107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921392131';
strPatternMonth: PWideChar =
'-00--01--02--03--04--05--06--07--08--09--10--11--12-';
strPatternHour: PWideChar =
' 00: 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: ' +
'16: 17: 18: 19: 20: 21: 22: 23:';
strPatternSecond: PWideChar =
':00.:01.:02.:03.:04.:05.:06.:07.:08.:09.: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.:37.:38.:' +
'39.:40.:41.:42.:43.:44.:45.:46.:47.:48.:49.:50.:51.:52.:53.:54.:55.:56.:57.:58.:59.';
procedure sfNowToBuf(const OutBuf: PWideChar; BufSize: Integer);
var
Year, Month, Day, HH, MM, SS, ZZZ: WORD;
P: PUInt32;
I: Integer;
SystemTime: TSystemTime;
lvBuf: array[0..23] of Widechar;
begin
if BufSize <= 0 then Exit;
P := @lvBuf[0]; // OutBuff;
GetLocalTime(SystemTime);
Year := SystemTime.wYear - 2014;
Month := SystemTime.wMonth;
Day := SystemTime.wDay;
HH := SystemTime.wHour;
MM := SystemTime.wMinute;
SS := SystemTime.wSecond;
ZZZ := SystemTime.wMilliseconds;
//Year
PUInt64(P)^ := PUInt64Array(strPatternYear)[Year]; Inc(PUInt64(P));
//Month
PUInt64(P)^ := PUInt64Array(strPatternMonth)[Month]; Inc(PUInt64(P));
//Day
P^ := PUInt32Array(strPatternHandred)[Day]; Inc(P);
//HH
PUInt64(P)^ := PUInt64Array(strPatternHour)[HH]; Inc(PUInt64(P));
//MM
P^ := PUInt32Array(strPatternHandred)[MM]; Inc(P);
//SS
PUInt64(P)^ := PUInt64Array(strPatternSecond)[SS]; Inc(PUInt64(P));
//ZZZ
I := (ZZZ div 10);
P^ := PUInt32Array(strPatternHandred)[I]; Inc(P);
I := (ZZZ mod 10);
P^ := PUInt32Array(strPattern10)[I];
if BufSize > 23 then BufSize := 23;
Move(lvBuf, OutBuf^, BufSize*Sizeof(WideChar));
end;
极限优化,进一步做了提速。
64位 XE10.1,Debug,运行10,000,000次结果:
FormatDateTime:18596 ms
歼10:2464 ms
楼顶:921 ms
本楼:795 ms
64位 XE10.1,Release,运行10,000,000次结果:
FormatDateTime:19437 ms
歼10:1311 ms
楼顶:795 ms
本楼:671 ms
32位 XE10.1 下本楼跟楼顶的速度一样。
程序如下:
type
PUInt64 = ^UInt64;
UInt64Array = array[0..0] of UInt64;
PUInt64Array = ^UInt64Array;
const
strPatternYear: PWideChar =
'201420152016201720182019202020212022202320242025202620272028202920302031' +
'2032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056' +
'2057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081' +
'2082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106' +
'2107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921392131';
strPatternMonth: PWideChar =
'-00--01--02--03--04--05--06--07--08--09--10--11--12-';
strPatternHour: PWideChar =
' 00: 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: ' +
'16: 17: 18: 19: 20: 21: 22: 23:';
strPatternSecond: PWideChar =
':00.:01.:02.:03.:04.:05.:06.:07.:08.:09.: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.:37.:38.:' +
'39.:40.:41.:42.:43.:44.:45.:46.:47.:48.:49.:50.:51.:52.:53.:54.:55.:56.:57.:58.:59.';
strPatternDDH: PWideChar =
'00 000 100 200 300 400 500 600 700 800 901 001 101 201 301 401 501 601 701 801 9'+
'02 002 102 202 302 402 502 602 702 802 903 003 103 203 303 403 503 603 703 803 9'+
'04 004 104 204 304 404 504 604 704 804 905 005 105 205 305 405 505 605 705 805 9'+
'06 006 106 206 306 406 506 606 706 806 907 007 107 207 307 407 507 607 707 807 9'+
'08 008 108 208 308 408 508 608 708 808 909 009 109 209 309 409 509 609 709 809 9'+
'10 010 110 210 310 410 510 610 710 810 911 011 111 211 311 411 511 611 711 811 9'+
'12 012 112 212 312 412 512 612 712 812 913 013 113 213 313 413 513 613 713 813 9'+
'14 014 114 214 314 414 514 614 714 814 915 015 115 215 315 415 515 615 715 815 9'+
'16 016 116 216 316 416 516 616 716 816 917 017 117 217 317 417 517 617 717 817 9'+
'18 018 118 218 318 418 518 618 718 818 919 019 119 219 319 419 519 619 719 819 9'+
'20 020 120 220 320 420 520 620 720 820 921 021 121 221 321 421 521 621 721 821 9'+
'22 022 122 222 322 422 522 622 722 822 923 023 123 223 323 423 523 623 723 823 9'+
'24 024 124 224 324 424 524 624 724 824 925 025 125 225 325 425 525 625 725 825 9'+
'26 026 126 226 326 426 526 626 726 826 927 027 127 227 327 427 527 627 727 827 9'+
'28 028 128 228 328 428 528 628 728 828 929 029 129 229 329 429 529 629 729 829 9'+
'30 030 130 230 330 430 530 630 730 830 931 031 131 231 331 431 531 631 731 831 9'+
'32 032 132 232 332 432 532 632 732 832 933 033 133 233 333 433 533 633 733 833 9'+
'34 034 134 234 334 434 534 634 734 834 935 035 135 235 335 435 535 635 735 835 9'+
'36 036 136 236 336 436 536 636 736 836 937 037 137 237 337 437 537 637 737 837 9'+
'38 038 138 238 338 438 538 638 738 838 939 039 139 239 339 439 539 639 739 839 9'+
'40 040 140 240 340 440 540 640 740 840 941 041 141 241 341 441 541 641 741 841 9'+
'42 042 142 242 342 442 542 642 742 842 943 043 143 243 343 443 543 643 743 843 9'+
'44 044 144 244 344 444 544 644 744 844 945 045 145 245 345 445 545 645 745 845 9'+
'46 046 146 246 346 446 546 646 746 846 947 047 147 247 347 447 547 647 747 847 9'+
'48 048 148 248 348 448 548 648 748 848 949 049 149 249 349 449 549 649 749 849 9'+
'50 050 150 250 350 450 550 650 750 850 951 051 151 251 351 451 551 651 751 851 9'+
'52 052 152 252 352 452 552 652 752 852 953 053 153 253 353 453 553 653 753 853 9'+
'54 054 154 254 354 454 554 654 754 854 955 055 155 255 355 455 555 655 755 855 9'+
'56 056 156 256 356 456 556 656 756 856 957 057 157 257 357 457 557 657 757 857 9'+
'58 058 158 258 358 458 558 658 758 858 959 059 159 259 359 459 559 659 759 859 9';
strPatternHMM: PWideChar =
'0:000:010:020:030:040:050:060:070:080:090:100:110:120:130:140:150:160:170:180:190:200:210:220:230:240:250:260:270:280:29'+
'0:300:310:320:330:340:350:360:370:380:390:400:410:420:430:440:450:460:470:480:490:500:510:520:530:540:550:560:570:580:59'+
'1:001:011:021:031:041:051:061:071:081:091:101:111:121:131:141:151:161:171:181:191:201:211:221:231:241:251:261:271:281:29'+
'1:301:311:321:331:341:351:361:371:381:391:401:411:421:431:441:451:461:471:481:491:501:511:521:531:541:551:561:571:581:59'+
'2:002:012:022:032:042:052:062:072:082:092:102:112:122:132:142:152:162:172:182:192:202:212:222:232:242:252:262:272:282:29'+
'2:302:312:322:332:342:352:362:372:382:392:402:412:422:432:442:452:462:472:482:492:502:512:522:532:542:552:562:572:582:59'+
'3:003:013:023:033:043:053:063:073:083:093:103:113:123:133:143:153:163:173:183:193:203:213:223:233:243:253:263:273:283:29'+
'3:303:313:323:333:343:353:363:373:383:393:403:413:423:433:443:453:463:473:483:493:503:513:523:533:543:553:563:573:583:59'+
'4:004:014:024:034:044:054:064:074:084:094:104:114:124:134:144:154:164:174:184:194:204:214:224:234:244:254:264:274:284:29'+
'4:304:314:324:334:344:354:364:374:384:394:404:414:424:434:444:454:464:474:484:494:504:514:524:534:544:554:564:574:584:59'+
'5:005:015:025:035:045:055:065:075:085:095:105:115:125:135:145:155:165:175:185:195:205:215:225:235:245:255:265:275:285:29'+
'5:305:315:325:335:345:355:365:375:385:395:405:415:425:435:445:455:465:475:485:495:505:515:525:535:545:555:565:575:585:59'+
'6:006:016:026:036:046:056:066:076:086:096:106:116:126:136:146:156:166:176:186:196:206:216:226:236:246:256:266:276:286:29'+
'6:306:316:326:336:346:356:366:376:386:396:406:416:426:436:446:456:466:476:486:496:506:516:526:536:546:556:566:576:586:59'+
'7:007:017:027:037:047:057:067:077:087:097:107:117:127:137:147:157:167:177:187:197:207:217:227:237:247:257:267:277:287:29'+
'7:307:317:327:337:347:357:367:377:387:397:407:417:427:437:447:457:467:477:487:497:507:517:527:537:547:557:567:577:587:59'+
'8:008:018:028:038:048:058:068:078:088:098:108:118:128:138:148:158:168:178:188:198:208:218:228:238:248:258:268:278:288:29'+
'8:308:318:328:338:348:358:368:378:388:398:408:418:428:438:448:458:468:478:488:498:508:518:528:538:548:558:568:578:588:59'+
'9:009:019:029:039:049:059:069:079:089:099:109:119:129:139:149:159:169:179:189:199:209:219:229:239:249:259:269:279:289:29'+
'9:309:319:329:339:349:359:369:379:389:399:409:419:429:439:449:459:469:479:489:499:509:519:529:539:549:559:569:579:589:59';
strPatternZZZ: PWideChar =
'000'#0'001'#0'002'#0'003'#0'004'#0'005'#0'006'#0'007'#0'008'#0'009'#0'010'#0'011'#0'012'#0'013'#0'014'#0'015'#0'016'#0'017'#0'018'#0'019'#0'020'#0'021'#0'022'#0'023'#0'024'#0+
'025'#0'026'#0'027'#0'028'#0'029'#0'030'#0'031'#0'032'#0'033'#0'034'#0'035'#0'036'#0'037'#0'038'#0'039'#0'040'#0'041'#0'042'#0'043'#0'044'#0'045'#0'046'#0'047'#0'048'#0'049'#0+
'050'#0'051'#0'052'#0'053'#0'054'#0'055'#0'056'#0'057'#0'058'#0'059'#0'060'#0'061'#0'062'#0'063'#0'064'#0'065'#0'066'#0'067'#0'068'#0'069'#0'070'#0'071'#0'072'#0'073'#0'074'#0+
'075'#0'076'#0'077'#0'078'#0'079'#0'080'#0'081'#0'082'#0'083'#0'084'#0'085'#0'086'#0'087'#0'088'#0'089'#0'090'#0'091'#0'092'#0'093'#0'094'#0'095'#0'096'#0'097'#0'098'#0'099'#0+
'100'#0'101'#0'102'#0'103'#0'104'#0'105'#0'106'#0'107'#0'108'#0'109'#0'110'#0'111'#0'112'#0'113'#0'114'#0'115'#0'116'#0'117'#0'118'#0'119'#0'120'#0'121'#0'122'#0'123'#0'124'#0+
'125'#0'126'#0'127'#0'128'#0'129'#0'130'#0'131'#0'132'#0'133'#0'134'#0'135'#0'136'#0'137'#0'138'#0'139'#0'140'#0'141'#0'142'#0'143'#0'144'#0'145'#0'146'#0'147'#0'148'#0'149'#0+
'150'#0'151'#0'152'#0'153'#0'154'#0'155'#0'156'#0'157'#0'158'#0'159'#0'160'#0'161'#0'162'#0'163'#0'164'#0'165'#0'166'#0'167'#0'168'#0'169'#0'170'#0'171'#0'172'#0'173'#0'174'#0+
'175'#0'176'#0'177'#0'178'#0'179'#0'180'#0'181'#0'182'#0'183'#0'184'#0'185'#0'186'#0'187'#0'188'#0'189'#0'190'#0'191'#0'192'#0'193'#0'194'#0'195'#0'196'#0'197'#0'198'#0'199'#0+
'200'#0'201'#0'202'#0'203'#0'204'#0'205'#0'206'#0'207'#0'208'#0'209'#0'210'#0'211'#0'212'#0'213'#0'214'#0'215'#0'216'#0'217'#0'218'#0'219'#0'220'#0'221'#0'222'#0'223'#0'224'#0+
'225'#0'226'#0'227'#0'228'#0'229'#0'230'#0'231'#0'232'#0'233'#0'234'#0'235'#0'236'#0'237'#0'238'#0'239'#0'240'#0'241'#0'242'#0'243'#0'244'#0'245'#0'246'#0'247'#0'248'#0'249'#0+
'250'#0'251'#0'252'#0'253'#0'254'#0'255'#0'256'#0'257'#0'258'#0'259'#0'260'#0'261'#0'262'#0'263'#0'264'#0'265'#0'266'#0'267'#0'268'#0'269'#0'270'#0'271'#0'272'#0'273'#0'274'#0+
'275'#0'276'#0'277'#0'278'#0'279'#0'280'#0'281'#0'282'#0'283'#0'284'#0'285'#0'286'#0'287'#0'288'#0'289'#0'290'#0'291'#0'292'#0'293'#0'294'#0'295'#0'296'#0'297'#0'298'#0'299'#0+
'300'#0'301'#0'302'#0'303'#0'304'#0'305'#0'306'#0'307'#0'308'#0'309'#0'310'#0'311'#0'312'#0'313'#0'314'#0'315'#0'316'#0'317'#0'318'#0'319'#0'320'#0'321'#0'322'#0'323'#0'324'#0+
'325'#0'326'#0'327'#0'328'#0'329'#0'330'#0'331'#0'332'#0'333'#0'334'#0'335'#0'336'#0'337'#0'338'#0'339'#0'340'#0'341'#0'342'#0'343'#0'344'#0'345'#0'346'#0'347'#0'348'#0'349'#0+
'350'#0'351'#0'352'#0'353'#0'354'#0'355'#0'356'#0'357'#0'358'#0'359'#0'360'#0'361'#0'362'#0'363'#0'364'#0'365'#0'366'#0'367'#0'368'#0'369'#0'370'#0'371'#0'372'#0'373'#0'374'#0+
'375'#0'376'#0'377'#0'378'#0'379'#0'380'#0'381'#0'382'#0'383'#0'384'#0'385'#0'386'#0'387'#0'388'#0'389'#0'390'#0'391'#0'392'#0'393'#0'394'#0'395'#0'396'#0'397'#0'398'#0'399'#0+
'400'#0'401'#0'402'#0'403'#0'404'#0'405'#0'406'#0'407'#0'408'#0'409'#0'410'#0'411'#0'412'#0'413'#0'414'#0'415'#0'416'#0'417'#0'418'#0'419'#0'420'#0'421'#0'422'#0'423'#0'424'#0+
'425'#0'426'#0'427'#0'428'#0'429'#0'430'#0'431'#0'432'#0'433'#0'434'#0'435'#0'436'#0'437'#0'438'#0'439'#0'440'#0'441'#0'442'#0'443'#0'444'#0'445'#0'446'#0'447'#0'448'#0'449'#0+
'450'#0'451'#0'452'#0'453'#0'454'#0'455'#0'456'#0'457'#0'458'#0'459'#0'460'#0'461'#0'462'#0'463'#0'464'#0'465'#0'466'#0'467'#0'468'#0'469'#0'470'#0'471'#0'472'#0'473'#0'474'#0+
'475'#0'476'#0'477'#0'478'#0'479'#0'480'#0'481'#0'482'#0'483'#0'484'#0'485'#0'486'#0'487'#0'488'#0'489'#0'490'#0'491'#0'492'#0'493'#0'494'#0'495'#0'496'#0'497'#0'498'#0'499'#0+
'500'#0'501'#0'502'#0'503'#0'504'#0'505'#0'506'#0'507'#0'508'#0'509'#0'510'#0'511'#0'512'#0'513'#0'514'#0'515'#0'516'#0'517'#0'518'#0'519'#0'520'#0'521'#0'522'#0'523'#0'524'#0+
'525'#0'526'#0'527'#0'528'#0'529'#0'530'#0'531'#0'532'#0'533'#0'534'#0'535'#0'536'#0'537'#0'538'#0'539'#0'540'#0'541'#0'542'#0'543'#0'544'#0'545'#0'546'#0'547'#0'548'#0'549'#0+
'550'#0'551'#0'552'#0'553'#0'554'#0'555'#0'556'#0'557'#0'558'#0'559'#0'560'#0'561'#0'562'#0'563'#0'564'#0'565'#0'566'#0'567'#0'568'#0'569'#0'570'#0'571'#0'572'#0'573'#0'574'#0+
'575'#0'576'#0'577'#0'578'#0'579'#0'580'#0'581'#0'582'#0'583'#0'584'#0'585'#0'586'#0'587'#0'588'#0'589'#0'590'#0'591'#0'592'#0'593'#0'594'#0'595'#0'596'#0'597'#0'598'#0'599'#0+
'600'#0'601'#0'602'#0'603'#0'604'#0'605'#0'606'#0'607'#0'608'#0'609'#0'610'#0'611'#0'612'#0'613'#0'614'#0'615'#0'616'#0'617'#0'618'#0'619'#0'620'#0'621'#0'622'#0'623'#0'624'#0+
'625'#0'626'#0'627'#0'628'#0'629'#0'630'#0'631'#0'632'#0'633'#0'634'#0'635'#0'636'#0'637'#0'638'#0'639'#0'640'#0'641'#0'642'#0'643'#0'644'#0'645'#0'646'#0'647'#0'648'#0'649'#0+
'650'#0'651'#0'652'#0'653'#0'654'#0'655'#0'656'#0'657'#0'658'#0'659'#0'660'#0'661'#0'662'#0'663'#0'664'#0'665'#0'666'#0'667'#0'668'#0'669'#0'670'#0'671'#0'672'#0'673'#0'674'#0+
'675'#0'676'#0'677'#0'678'#0'679'#0'680'#0'681'#0'682'#0'683'#0'684'#0'685'#0'686'#0'687'#0'688'#0'689'#0'690'#0'691'#0'692'#0'693'#0'694'#0'695'#0'696'#0'697'#0'698'#0'699'#0+
'700'#0'701'#0'702'#0'703'#0'704'#0'705'#0'706'#0'707'#0'708'#0'709'#0'710'#0'711'#0'712'#0'713'#0'714'#0'715'#0'716'#0'717'#0'718'#0'719'#0'720'#0'721'#0'722'#0'723'#0'724'#0+
'725'#0'726'#0'727'#0'728'#0'729'#0'730'#0'731'#0'732'#0'733'#0'734'#0'735'#0'736'#0'737'#0'738'#0'739'#0'740'#0'741'#0'742'#0'743'#0'744'#0'745'#0'746'#0'747'#0'748'#0'749'#0+
'750'#0'751'#0'752'#0'753'#0'754'#0'755'#0'756'#0'757'#0'758'#0'759'#0'760'#0'761'#0'762'#0'763'#0'764'#0'765'#0'766'#0'767'#0'768'#0'769'#0'770'#0'771'#0'772'#0'773'#0'774'#0+
'775'#0'776'#0'777'#0'778'#0'779'#0'780'#0'781'#0'782'#0'783'#0'784'#0'785'#0'786'#0'787'#0'788'#0'789'#0'790'#0'791'#0'792'#0'793'#0'794'#0'795'#0'796'#0'797'#0'798'#0'799'#0+
'800'#0'801'#0'802'#0'803'#0'804'#0'805'#0'806'#0'807'#0'808'#0'809'#0'810'#0'811'#0'812'#0'813'#0'814'#0'815'#0'816'#0'817'#0'818'#0'819'#0'820'#0'821'#0'822'#0'823'#0'824'#0+
'825'#0'826'#0'827'#0'828'#0'829'#0'830'#0'831'#0'832'#0'833'#0'834'#0'835'#0'836'#0'837'#0'838'#0'839'#0'840'#0'841'#0'842'#0'843'#0'844'#0'845'#0'846'#0'847'#0'848'#0'849'#0+
'850'#0'851'#0'852'#0'853'#0'854'#0'855'#0'856'#0'857'#0'858'#0'859'#0'860'#0'861'#0'862'#0'863'#0'864'#0'865'#0'866'#0'867'#0'868'#0'869'#0'870'#0'871'#0'872'#0'873'#0'874'#0+
'875'#0'876'#0'877'#0'878'#0'879'#0'880'#0'881'#0'882'#0'883'#0'884'#0'885'#0'886'#0'887'#0'888'#0'889'#0'890'#0'891'#0'892'#0'893'#0'894'#0'895'#0'896'#0'897'#0'898'#0'899'#0+
'900'#0'901'#0'902'#0'903'#0'904'#0'905'#0'906'#0'907'#0'908'#0'909'#0'910'#0'911'#0'912'#0'913'#0'914'#0'915'#0'916'#0'917'#0'918'#0'919'#0'920'#0'921'#0'922'#0'923'#0'924'#0+
'925'#0'926'#0'927'#0'928'#0'929'#0'930'#0'931'#0'932'#0'933'#0'934'#0'935'#0'936'#0'937'#0'938'#0'939'#0'940'#0'941'#0'942'#0'943'#0'944'#0'945'#0'946'#0'947'#0'948'#0'949'#0+
'950'#0'951'#0'952'#0'953'#0'954'#0'955'#0'956'#0'957'#0'958'#0'959'#0'960'#0'961'#0'962'#0'963'#0'964'#0'965'#0'966'#0'967'#0'968'#0'969'#0'970'#0'971'#0'972'#0'973'#0'974'#0+
'975'#0'976'#0'977'#0'978'#0'979'#0'980'#0'981'#0'982'#0'983'#0'984'#0'985'#0'986'#0'987'#0'988'#0'989'#0'990'#0'991'#0'992'#0'993'#0'994'#0'995'#0'996'#0'997'#0'998'#0'999'#0;
procedure sfNowToBuf(const OutBuf: PWideChar; BufSize: Integer);
var
Year, Month, Day, HH, MM, SS, ZZZ, DDH, HMM: WORD;
P: PUInt64;
I: Integer;
SystemTime: TSystemTime;
lvBuf: array[0..23] of Widechar;
begin
if BufSize < 24 then Exit;
P := Pointer(OutBuf);
GetLocalTime(SystemTime);
Year := SystemTime.wYear - 2014;
Month := SystemTime.wMonth;
DDH := SystemTime.wDay * 10 + SystemTime.wHour div 10;
HMM := (SystemTime.wHour mod 10) * 60 + SystemTime.wMinute;
SS := SystemTime.wSecond;
ZZZ := SystemTime.wMilliseconds;
//Year
P^ := PUInt64Array(strPatternYear)[Year]; Inc(P);
//Month
P^ := PUInt64Array(strPatternMonth)[Month]; Inc(P);
//DD H
P^ := PUInt64Array(strPatternDDH)[DDH]; Inc(P);
//H:MM
P^ := PUInt64Array(strPatternHMM)[HMM]; Inc(P);
//:SS.
P^ := PUInt64Array(strPatternSecond)[SS]; Inc(P);
//ZZZ
P^ := PUInt64Array(strPatternZZZ)[ZZZ]; ;
// if BufSize > 24 then BufSize := 24;
// Move(lvBuf, OutBuf^, BufSize*Sizeof(WideChar));
end;