[delphi] 0955 interpreteren als tijd

Pagina: 1
Acties:

  • youngster
  • Registratie: Maart 2004
  • Laatst online: 20-05-2025
Ik krijg in een tekstbestandje 0955 of 1245 binnen als tijd.
Hoe krijg ik dit het handigste in een TDateTime?

Ik heb het een en ander geprobeerd met FormatSettings maar dat lukt ook niet echt.
Alternatief is om er met stringbewerkingen een dubbele punt tussen te zetten,
dan gaat het wel goed maar dit lijkt me niet de optimale oplossing.

time: TDateTime;
time := StrToTime('0955');

Dit geeft een EConvert error omdat 0955 geen geldige tijd is.

Real programmers don't comment their code... it was hard to write, it should be hard to read!


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:28

mulder

ik spuug op het trottoir

en als je er een dubble punt tussen zet?

oogjes open, snaveltjes dicht


  • jackal.nl
  • Registratie: Februari 2005
  • Laatst online: 06-05 19:52
De functie EncodeTime doet precies wat jij wil...

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Don Facundo schreef op woensdag 11 mei 2005 @ 09:29:
en als je er een dubble punt tussen zet?
Dan gaat het dus goed, zoals hij dat al zelf zegt :)
En dat lijkt me een prima oplossing. Waarom denk je dat het niet optimaal is?

Eventueel zou je de globale variabele ShortTimeFormat nog kunnen zetten. Alleen pas je dan ook de manier aan hoe de tijd wordt afgedrukt.

Edit: encodetime pakt geen strings als params dus dat lijkt me niet bruikbaar ;)

[ Voor 9% gewijzigd door Creepy op 11-05-2005 09:35 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • jackal.nl
  • Registratie: Februari 2005
  • Laatst online: 06-05 19:52
Pfff, ja idd. Pakt geen strings. Maar beetje creatief ermee omgaan en dan is dat toch een fluitje van een cent. Kun je ook nog wat foutafhandeling inbouwen tenminste bij het omzetten naar getallen, je weet maar nooit...

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Dat kan door er een dubbele punt tussen zetten en de EConvert Exception af te vangen ook prima.
Met EncodeTime zit er weer een extra omzettingen van string naar int's tussen waarbij je dus van te voren extra controles moet gaan doen terwijl StrToTime dit al voor je kan doen ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • El_kingo
  • Registratie: Mei 2002
  • Laatst online: 17-03-2025
Maar als je ze in een tekstbestand krijgt aangeleverd kun je ze dus ook gewoon als int laten inlezen.
Dit scheelt weer een omzetting van string naar int voor EncodeTime.

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Als de string altijd uit 4 karakters bestaat, lijkt het me toch ook niet zo moeilijk deze zelf uit elkaar te plukken? str[0] en str[1] voor de uren, en str[2] en str[3] voor de minuten... Hoe je dat in een TDateTime moet krijgen in Delphi weet ik niet.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Creepy schreef op woensdag 11 mei 2005 @ 09:50:
Dat kan door er een dubbele punt tussen zetten en de EConvert Exception af te vangen ook prima.
Met EncodeTime zit er weer een extra omzettingen van string naar int's tussen waarbij je dus van te voren extra controles moet gaan doen terwijl StrToTime dit al voor je kan doen ;)
Die dubbele punt ertussen zetten is ongeveer net zo zwaar als die 4 karakters opsplitsen naar 2 integers...
En bovendien komen StrToTime en EncodeTime uiteindelijk uit op dezelfde basisfunctie:
Delphi:
1
2
3
4
5
6
7
8
9
function TryEncodeTime(Hour, Min, Sec, MSec: Word; out Time: TDateTime): Boolean;
begin
  Result := False;
  if (Hour < 24) and (Min < 60) and (Sec < 60) and (MSec < 1000) then
  begin
    Time := (Hour * 3600000 + Min * 60000 + Sec * 1000 + MSec) / MSecsPerDay;
    Result := True;
  end;
end;

Alleen heeft StrToTime dan nog een aantal (in dit geval) onnodige checks, bv. of er misschien AM/PM in de string staat. Oftewel, EncodeTime is hier nog niet zo'n slechte keuze... :)

  • jackal.nl
  • Registratie: Februari 2005
  • Laatst online: 06-05 19:52
Tja. Had ik toch nog beetje gelijk met EncodeTime...

Maar als je het helemaal basaal wilt doen, is er nog een oplossing. Zoals bekend is tijd gewoon een gebroken getal waarbij de helen staan voor de dagen en het gedeelte achter de komma voor de tijd. De volgende functie zet op deze manier de string eenvoudig om naar een TDateTime.

code:
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
function MakeTime(TimeStr: string): TDateTime;
var
  Hours, Minutes: byte;
  Code: integer;
begin
  if Length(TimeStr) <> 4
  then
    Result := 0
  else
    begin
      Val(TimeStr[1] + TimeStr[2], Hours, Code);
      if Code = 0
      then
        begin
          Val(TimeStr[3] + TimeStr[4], Minutes, Code);
          if Code = 0
          then
            Result := (Hours / 24) + (Minutes / (24 * 60))
          else
            Result := 0;
        end
      else
        Result := 0;
    end;
end;
Pagina: 1