Advertisement
WarPie90

FormatMillisec

May 11th, 2022 (edited)
1,651
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.84 KB | None | 0 0
  1. program new;
  2.  
  3. type
  4.   TFormatEnum = (
  5.     fmtYearsNoPad,   fmtYears,
  6.     fmtMonthsNoPad,  fmtMonths,
  7.     fmtWeeksNoPad,   fmtWeeks,
  8.     fmtDaysNoPad,    fmtDays,
  9.     fmtHoursNoPad,   fmtHours,
  10.     fmtMinutesNoPad, fmtMinutes,
  11.     fmtSecondsNoPad, fmtSeconds,
  12.     fmtMillisecondsNoPad, fmtMilliseconds
  13.   );
  14.  
  15. function String.Count(substr: string): Int32;
  16. var
  17.   i: Int32;
  18. begin
  19.   Result := Length(PosMulti(substr, self));
  20. end;
  21.  
  22. //Y-m-d h:i:s
  23. function FormatMillisec(Time: Double; Fmt: string): string;
  24. var
  25.   p, q: Int32;
  26.   flags: set of TFormatEnum;
  27.   flag: TFormatEnum;
  28.   function Next(step: Int32=1): Char;
  29.   begin
  30.     Inc(p, step);
  31.     if p <= Length(Fmt) then
  32.       Exit(Fmt[p]);
  33.     Result := #0;
  34.   end;
  35. var
  36.   timeLeft: Double;
  37.   years, months, weeks, days, hours, minutes, sec, ms: Double;
  38. begin
  39.   // with this we create the needed flags
  40.   Fmt += #0;
  41.   p := 1;
  42.   while (p <= Length(fmt)) and (Fmt[p] <> #0) do
  43.   begin
  44.     q := p;
  45.     case Fmt[p] of
  46.       '\': Next(2);
  47.       'Y': begin
  48.              while Next() = 'Y' do ;
  49.              case p-q of
  50.                1: flags += fmtYearsNoPad;
  51.                2: flags += fmtYears;
  52.                else raise 'Illegal format';
  53.              end;
  54.            end;
  55.       'M': begin
  56.              while Next() = 'M' do ;
  57.              case p-q of
  58.                1: flags += fmtMonthsNoPad;
  59.                2: flags += fmtMonths;
  60.                else raise 'Illegal format';
  61.              end;
  62.            end;
  63.       'W': begin
  64.              while Next() = 'W' do ;
  65.              case p-q of
  66.                1: flags += fmtWeeksNoPad;
  67.                2: flags += fmtWeeks;
  68.                else raise 'Illegal format';
  69.              end;
  70.            end;
  71.       'D': begin
  72.              while Next() = 'D' do ;
  73.              case p-q of
  74.                1: flags += fmtDaysNoPad;
  75.                2: flags += fmtDays;
  76.                else raise 'Illegal format';
  77.              end;
  78.            end;
  79.       'h': begin
  80.              while Next() = 'h' do ;
  81.              case p-q of
  82.                1: flags += fmtHoursNoPad;
  83.                2: flags += fmtHours;
  84.                else raise 'Illegal format';
  85.              end;
  86.            end;
  87.       'm': begin
  88.              while Next() = 'm' do ;
  89.              case p-q of
  90.                1: flags += fmtMinutesNoPad;
  91.                2: flags += fmtMinutes;
  92.                else raise 'Illegal format';
  93.              end;
  94.            end;
  95.       's': begin
  96.              while Next() = 's' do ;
  97.              case p-q of
  98.                1: flags += fmtSecondsNoPad;
  99.                2: flags += fmtSeconds;
  100.                else raise 'Illegal format';
  101.              end;
  102.            end;
  103.       'u': begin
  104.              while Next() = 'u' do ;
  105.              case p-q of
  106.                1: flags += fmtMillisecondsNoPad;
  107.                2: flags += fmtMilliseconds;
  108.                else raise 'Illegal format';
  109.              end;
  110.            end;
  111.       else
  112.         Next();
  113.     end;
  114.   end;
  115.  
  116.   // with this we reduce in the order of flags
  117.   timeLeft := time;
  118.   for flag in flags do
  119.   begin
  120.     case flag of
  121.       fmtYearsNoPad, fmtYears:
  122.         begin
  123.           years := Trunc(timeLeft / 1000 / 60 / 60 / 24 / 365);
  124.           timeLeft -= years * 365 * 24 * 60 * 60 * 1000;
  125.         end;
  126.       fmtMonthsNoPad,  fmtMonths:
  127.         begin
  128.           months := Trunc(timeLeft / 1000 / 60 / 60 / 24 / 30.5);
  129.           timeLeft -= months * 30.5 * 24 * 60 * 60 * 1000;
  130.         end;
  131.       fmtWeeksNoPad,  fmtWeeks:
  132.         begin
  133.           weeks := Trunc(timeLeft / 1000 / 60 / 60 / 24 / 7);
  134.           timeLeft -= weeks * 7 * 24 * 60 * 60 * 1000;
  135.         end;
  136.       fmtDaysNoPad, fmtDays:
  137.         begin
  138.           days := Trunc(timeLeft / 1000 / 60 / 60 / 24);
  139.           timeLeft -= days * 24 * 60 * 60 * 1000;
  140.         end;
  141.       fmtHoursNoPad, fmtHours:
  142.         begin
  143.           hours := Trunc(timeLeft / 1000 / 60 / 60);
  144.           timeLeft -= hours * 60 * 60 * 1000;
  145.         end;
  146.       fmtMinutesNoPad, fmtMinutes:
  147.         begin
  148.           minutes := Trunc(timeLeft / 1000 / 60);
  149.           timeLeft -= minutes * 60 * 1000;
  150.         end;
  151.       fmtSecondsNoPad, fmtSeconds:
  152.         begin
  153.           sec := Trunc(timeLeft / 1000);
  154.           timeLeft -= sec * 1000;
  155.         end;
  156.       fmtMillisecondsNoPad, fmtMilliseconds:
  157.         begin
  158.           ms := timeLeft;
  159.           timeLeft -= ms * 1000;
  160.         end;
  161.     end;
  162.   end;
  163.  
  164.   // now we rebuild the result based on the format
  165.   Result := '';
  166.   p := 1;
  167.   while (p <= Length(fmt)) and (Fmt[p] <> #0) do
  168.   begin
  169.     q := p;
  170.     case Fmt[p] of
  171.       '\': begin
  172.              Next();
  173.              Result += Fmt[p];
  174.              Next();
  175.            end;
  176.       'Y': begin
  177.              while Next() = 'Y' do ;
  178.              if fmtYearsNoPad in flags then
  179.                Result += ToString(Trunc(years))
  180.              else begin
  181.                if years < 10 then Result += '0';
  182.                Result += ToString(Trunc(years));
  183.              end;
  184.            end;
  185.       'M': begin
  186.              while Next() = 'M' do ;
  187.              if fmtMonthsNoPad in flags then
  188.                Result += ToString(Trunc(months))
  189.              else begin
  190.                if months < 10 then Result += '0';
  191.                Result += ToString(Trunc(months));
  192.              end;
  193.            end;
  194.       'W': begin
  195.              while Next() = 'W' do ;
  196.              if fmtWeeksNoPad in flags then
  197.                Result += ToString(Trunc(weeks))
  198.              else begin
  199.                if weeks < 10 then Result += '0';
  200.                Result += ToString(Trunc(weeks));
  201.              end;
  202.            end;
  203.       'D': begin
  204.              while Next() = 'D' do ;
  205.              if fmtDaysNoPad in flags then
  206.                Result += ToString(Trunc(days))
  207.              else begin
  208.                if days < 10 then Result += '0';
  209.                Result += ToString(Trunc(days));
  210.              end;
  211.            end;
  212.       'h': begin
  213.              while Next() = 'h' do ;
  214.              if fmtHoursNoPad in flags then
  215.                Result += ToString(Trunc(hours))
  216.              else begin
  217.                if hours < 10 then Result += '0';
  218.                Result += ToString(Trunc(hours));
  219.              end;
  220.            end;
  221.       'm': begin
  222.              while Next() = 'm' do ;
  223.              if fmtMinutesNoPad in flags then
  224.                Result += ToString(Trunc(minutes))
  225.              else begin
  226.                if minutes < 10 then Result += '0';
  227.                Result += ToString(Trunc(minutes));
  228.              end;
  229.            end;
  230.       's': begin
  231.              while Next() = 's' do ;
  232.              if fmtSecondsNoPad in flags then
  233.                Result += ToString(Trunc(sec))
  234.              else begin
  235.                if sec < 10 then Result += '0';
  236.                Result += ToString(Trunc(sec));
  237.              end;
  238.            end;
  239.       'u': begin
  240.              while Next() = 'u' do ;
  241.              if fmtMillisecondsNoPad in flags then
  242.                Result += ToString(Trunc(ms))
  243.              else begin
  244.                if ms < 1000 then Result += '0';
  245.                if ms < 100 then  Result += '0';
  246.                if ms < 10 then   Result += '0';
  247.  
  248.                Result += ToString(Trunc(ms));
  249.              end;
  250.            end;
  251.       else
  252.       begin
  253.         Result += Fmt[p];
  254.         Next();
  255.       end;
  256.     end;
  257.   end;
  258. end;
  259.  
  260. function FormatMillisec(Time: Int64; TimeSymbols: Boolean=False): string; overload;
  261. var
  262.   timeLeft: Double;
  263.   years, months, weeks, days, hours, minutes, sec, ms: Double;
  264. begin
  265.   timeLeft := Time;
  266.   years := Trunc(timeLeft / 1000 / 60 / 60 / 24 / 365);
  267.   timeLeft -= years * 365 * 24 * 60 * 60 * 1000;
  268.  
  269.   months := Trunc(timeLeft / 1000 / 60 / 60 / 24 / 30.5);
  270.   timeLeft -= months * 30.5 * 24 * 60 * 60 * 1000;
  271.  
  272.   weeks := Trunc(timeLeft / 1000 / 60 / 60 / 24 / 7);
  273.   timeLeft -= months * 7 * 24 * 60 * 60 * 1000;
  274.  
  275.   days := Trunc(timeLeft / 1000 / 60 / 60 / 24);
  276.   timeLeft -= days * 24 * 60 * 60 * 1000;
  277.  
  278.   hours := Trunc(timeLeft / 1000 / 60 / 60);
  279.   timeLeft -= hours * 60 * 60 * 1000;
  280.  
  281.   minutes := Trunc(timeLeft / 1000 / 60);
  282.   timeLeft -= minutes * 60 * 1000;
  283.  
  284.   sec := Trunc(timeLeft / 1000);
  285.   timeLeft -= sec * 1000;
  286.  
  287.   ms := timeLeft;
  288.   timeLeft -= ms * 1000;
  289.   if not TimeSymbols then
  290.   begin
  291.     if      years  > 0 then Result := FormatMillisec(time, 'YY:MM:WW:DD:hh:mm:ss:uu')
  292.     else if months > 0 then Result := FormatMillisec(time, 'MM:WW:DD:hh:mm:ss:uu')
  293.     else if weeks  > 0 then Result := FormatMillisec(time, 'WW:DD:hh:mm:ss:uu')
  294.     else if days   > 0 then Result := FormatMillisec(time, 'DD:hh:mm:ss:uu')
  295.     else if hours  > 0 then Result := FormatMillisec(time, 'hh:mm:ss:uu')
  296.     else if minutes> 0 then Result := FormatMillisec(time, 'mm:ss:uu')
  297.     else if sec    > 0 then Result := FormatMillisec(time, 'ss:uu')
  298.     else                    Result := FormatMillisec(time, 'uu');
  299.   end else
  300.   begin
  301.     if      years  > 0 then Result := FormatMillisec(time, 'YY\y:MM\m:WW\w:DD\d:hh\h:mm\m:ss\s:uu\m\s')
  302.     else if months > 0 then Result := FormatMillisec(time, 'MM\m:WW\w:DD\d:hh\h:mm\m:ss\s:uu\m\s')
  303.     else if weeks  > 0 then Result := FormatMillisec(time, 'WW\w:DD\d:hh\h:mm\m:ss\s:uu\m\s')
  304.     else if days   > 0 then Result := FormatMillisec(time, 'DD\d:hh\h:mm\m:ss\s:uu\m\s')
  305.     else if hours  > 0 then Result := FormatMillisec(time, 'hh\h:mm\m:ss\s:uu\m\s')
  306.     else if minutes> 0 then Result := FormatMillisec(time, 'mm\m:ss\s:uu\m\s')
  307.     else if sec    > 0 then Result := FormatMillisec(time, 'ss\s:uu\m\s')
  308.     else                    Result := FormatMillisec(time, 'uu\m\s');
  309.   end;
  310. end;
  311.  
  312.  
  313. begin
  314.   WriteLn FormatMillisec(GetTickCount(), 's\s\e\c, m\m\i\n');
  315.   WriteLn FormatMillisec(GetTickCount(), 'hh\h:mm\m:ss\s:uu\m\s');
  316.   WriteLn FormatMillisec(GetTickCount(), 'YY-MM-DD h:m:s:u');
  317.   WriteLn FormatMillisec(GetTickCount());
  318.   WriteLn FormatMillisec(GetTickCount(), True);
  319. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement