![]() |
wie aus eigener systemtime richtiges datum machen??
hey there,
also da sich ja dieses thema ![]() wie bekomm ich eine eigene tsystemtime, also z.b. systemtime.wday + 12 wieder als funktionierendes datum hinn?? wenn ich es somache, dann würde er bei zb dem 31ten, einen 43 draus machen.. und das geht ja nun wirklich nicht ;-) wie bekomm ich also hinn, das es wieder ein ordentliches datum ergibt?? dabei ist wieder zu berücksichtigen, das units wie math, dateutils, sysutils, usw NICHT eingebunden werden, also alles wieder rein auf der win32api basierend... danke schonmal im vorraus.. |
Re: wie aus eigener systemtime richtiges datum machen??
nach langem suchen habe ich jetzt was gefunden, nur leider ist das in c++ und genau da drin bin ich ne totale niete ;-(
gibt es jemand der mir das mal nen bissel in deutsch, bzw delpisch umschreiben kann ;-) ![]() also das convertieren von systemtime und filetime damit habe ich keine probleme aber wie addiere ich zeiten auf tfiletime?? das raff ich nicht wirklich!! edit: das währe das hier: Zitat:
|
Re: wie aus eigener systemtime richtiges datum machen??
Just cast the filetime to Int64 and use add/substract operations
|
Re: wie aus eigener systemtime richtiges datum machen??
Zitat:
|
Re: wie aus eigener systemtime richtiges datum machen??
Delphi-Quellcode:
filetime := TFileTime(Int64(filetime) + YourAddition);
|
Re: wie aus eigener systemtime richtiges datum machen??
Zitat:
|
Re: wie aus eigener systemtime richtiges datum machen??
Delphi-Quellcode:
const
_SECOND: int64 = 10000000; _MINUTE: Int64 = 600000000; _HOUR: Int64 = 36000000000; _DAY: Int64 = 864000000000; var ft: FILETIME; i: Int64; begin // Set filetime to 0 which means January 1, 1601 ft.dwLowDateTime := 0; ft.dwHighDateTime := 0; // inc by 30 days ft := TFileTime(Int64(ft) + (30 * _DAY)); |
Re: wie aus eigener systemtime richtiges datum machen??
Zitat:
ok thx, i try it!! |
Re: wie aus eigener systemtime richtiges datum machen??
ok alles funzt super, respect :thumb: :thumb: :thumb:
ich hab daraus mal eine function gemacht, also fals es mal einer brauch:
Delphi-Quellcode:
function AddTime(AddTime: TSystemTime; TimeToAdd: int64): TSystemTime;
//TimeToAdd can be this: //const //_SECOND: int64 = 10000000; //_MINUTE: Int64 = 600000000; //_HOUR: Int64 = 36000000000; //_DAY: Int64 = 864000000000; //(_Day * 20) var TempFileTime: FILETIME; begin; Result := AddTime; if SystemTimeToFileTime(AddTime, TempFileTime) then begin; TempFileTime := TFileTime(Int64(TempFileTime) + TimeToAdd); FileTimeToSystemTime(TempFileTime, Result); end; end; |
Re: wie aus eigener systemtime richtiges datum machen??
Zitat:
TSysteTime ist doch ein recht einfaches Format und so schwer sollte das Rechnen damit doch nicht sein? |
Re: wie aus eigener systemtime richtiges datum machen??
Zitat:
deswegen der umweg ;-) |
Re: wie aus eigener systemtime richtiges datum machen??
schon bemerkt das es ein record ist, welcher auf netten WORDs besteht?
damit kann man doch wunderbar rechnen und dank einiger "neuer" Funktionen (z.B. Operatoren) für Records, kann man sich auch notfalls den TSystemTime-Record erweitern. |
Re: wie aus eigener systemtime richtiges datum machen??
ok dan geb mal ebend ein bsp, denn ich hab kp wie ich das anstellen soll, bin nämlich froh das es mit der anderen funktion jetzt funktioniert, und das hat mich schon halb zum verzweifeln gebracht, ich bin froh das es jetzt alles so läuft wie es soll...
|
Re: wie aus eigener systemtime richtiges datum machen??
Delphi-Quellcode:
oder
i := (X.Sekunde + Sekunden) div 60;
X.Sekunde := (X.Sekunde + Sekunden) mod 60; i2 := i; i := (X.Minute + i2) div 60; X.Minute := (X.Minute + i2) mod 60; i2 := i; i := (X.Stunde + i2) div 24; X.Stunde := (X.Stunde + i2) mod 24; ...
Delphi-Quellcode:
oder ...
i := X.Sekunde + Sekunden;
X.Sekunde := i mod 60; i := i div 60 + X.Minute; X.Minute := i mod 60; i := i div 60 + X.Stunde; X.Stunde := i mod 24; i := i div 24 + X.Tag; ... Mathematik halt .. nja, zumindestens hast du dir so ganz "elegant" das Problem mit den ungleichlangen Monaten und den Schaltjahren vom Hals geschafft :stupid: |
Re: wie aus eigener systemtime richtiges datum machen??
ja das ja schön und gut, aber wie soll ich das denn jetzt systemtime zuweisen?? das problem ist ja das ich Tsystemtime keine eigenen variablen addieren kann, ich kann zwar schon addieren, aber er akzeptiert das nicht... die berechnung ist ja nicht das problem sondern nur die zuweisung, und das geht halt nur wenn ich "leider" den umweg über filetime nehme..
|
Re: wie aus eigener systemtime richtiges datum machen??
wieso soll man da nix zuweisen können?
Delphi-Quellcode:
function AddTime(Time: TSystemTime; mSecsToAdd: int64): TSystemTime;
begin; Inc(mSecsToAdd, Time.wMilliseconds); Time.wMilliseconds := mSecsToAdd mod 1000; mSecsToAdd := mSecsToAdd div 1000 + Time.wSecond; Time.wSecond := mSecsToAdd mod 60; mSecsToAdd := mSecsToAdd div 60 + Time.wMinute; Time.wMinute := mSecsToAdd mod 60; mSecsToAdd := mSecsToAdd div 60 + Time.wHour; Time.wHour := mSecsToAdd mod 24; mSecsToAdd := mSecsToAdd div 24 + Time.wDay; ... end; |
Re: wie aus eigener systemtime richtiges datum machen??
Vom Variablennamen her addierst du Millisekunden auf Sekunden?
|
Re: wie aus eigener systemtime richtiges datum machen??
schön und gut, deine funktion nur ich glaub du hast mein problem nicht verstanden:
du kannst tsystemtime nichts zuweisen, bzw nichts addieren (zumindest nicht so) denn dann kommt kein glütiges datum mehr herraus! |
Re: wie aus eigener systemtime richtiges datum machen??
meinst du mich? (@Muetze1)
mSecs = MilliSeconds :angel2: klar hab ich dich verstanden ... beim Addieren mußt du halt drauf achten, daß die Werte im gültigen Bereich bleiben. Also wenn zu 59 Sekunden eine Sekunde zuaddiert wird, dann kommt 0 raus und zu Minute muß 1 zuaddiert werden. |
Re: wie aus eigener systemtime richtiges datum machen??
na wie muss ich das denn zb aufrufen wenn ich einen tag addieren will?? weil eigentlich geht es mir mehr um tag, monat und jahr..
|
Re: wie aus eigener systemtime richtiges datum machen??
nja, ganz ehrlich ... mit einem umweg über sowas wie TFileTime, TDateTime oder ähnliches ist es natürlich einfacher, da diese in Zeit seit einem bestimmten Zeitpunkt rechnen und somit das ganze Zeugs wie unterschiedlich lange Monate und Schaltjahre anders/einfacher gehandhabt werden kann.
+ 1 Tag
Delphi-Quellcode:
+ 1 Monat
Inc(Time.wDay);
If Time.wDay > DaysInMonth(Time.wMonth, Time.wYear) Then Begin Time.wDay := 1; Inc(Time.wMonth); If Time.wMonth) > 12 Then Begin Time.wMonth := 1; Inc(Time.wYear); End; End;
Delphi-Quellcode:
+ 1 Jahr
Inc(Time.wMonth);
If Time.wMonth) > 12 Then Begin Time.wMonth := 1; Inc(Time.wYear); End;
Delphi-Quellcode:
Inc(Time.wYear);
|
Re: wie aus eigener systemtime richtiges datum machen??
I might be picky but this is not accounting for leap years (when there is a february 29th) :wink:
|
Re: wie aus eigener systemtime richtiges datum machen??
Hallo,
zugegeben, ich habe den Thread nicht ganz gelesen, aber wenn ich Zeit-Arithmetik auf Windows-Ebene benötigen würde, dann würde ich wohl eher die Abbildungskette SYSTEMTIME <-> FILETIME <> time_t benutzen, wobei time_t die serial time aus der C Runtime Library ist. Für die erste Konvertierung gibt es API Funktionen, für die letzte eine Formel. Das Kapitel im Platform SDK heißt "Windows Time". Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz