7

私は(私にとって)かなり珍しい問題を抱えています。私は、ユーザーが明示的な日付(1955年6月3日に日付を変更)またはボタンを使用して増分(1か月進む)によってシステム時刻を前後に変更できるようにするアプリケーションを作成しています。

これは、課金システムの実際の使用法をシミュレートするために、このようなジャンプを必要とするソフトウェアを一部のユーザーがテストできるようにするために作成しています。

もちろん、Delphiで時刻を変更するのは非常に簡単です。

SetDateTime(2008,05,21,16,07,21,00);

しかし、Delphi(2006)に日付計算用のヘルパーが組み込まれているかどうかはわかりません。これは、私の最も嫌いなものの1つです:)

これを処理するための最良の方法について何か提案はありますか?winapi datetimeの呼び出しは最悪なので、ネイティブのままにしておきたいと思います。

ありがとう!

4

5 に答える 5

15

gabr と mliesen が述べたように、DateUtilsSysUtilsユニットを見てください。便利な機能が含まれています。

  • IncDay - 日数を加算または減算します。
  • IncMonth - 月数を加算または減算します。
  • IncWeek - 週数を加算または減算します。
  • IncYear - 年数を加算または減算します。
  • EncodeDate - Year、Month、および Day パラメータから TDateTime 値を返します。
于 2008-10-05T19:02:24.980 に答える
9

DateUtilsユニットにはたくさんのヘルパーがいます。

于 2008-10-03T18:12:15.050 に答える
5

現在の月の日が将来の月に存在しない場合、どうしたいですか? たとえば、1 月 31 日 + 1 か月ですか。年をインクリメントし、開始日がうるう年の 2 月 29 日である場合も、同じ問題が発生します。したがって、すべての日付で一貫して機能する普遍的な IncMonth または IncYear 関数は存在しません。

興味のある方には、2 つの日付間の月数と日数を計算する方法に関する、この種の計算に内在する複雑さに関するJulian Bucknall の記事を心からお勧めします。

以下は、一般的な日付計算に異常を導入しない唯一の可能な一般的な日付インクリメント関数です。しかし、これを達成するには、おそらく自分がプログラミングしている特定のアプリケーションの正確な要件を持っていると思われるプログラマーに責任を移すだけです。

IncDay - 日数を加算または減算します。
IncWeek - 週数を加算または減算します。

ただし、組み込み関数を使用する必要がある場合は、少なくとも、それらが目的どおりに機能することを確認してください。DateUtils および SysUtils ユニットを見てください。これらの関数のソース コードがあることは、Delphi の最も優れた点の 1 つです。そうは言っても、組み込み関数の完全なリストは次のとおりです。

IncDay - 日数を加算または減算します。
IncWeek - 週数を加算または減算します。
IncMonth - 月数を加算または減算します。
IncYear - 年数を加算または減算します。

質問の 2 番目の部分である、TDatetime を使用してシステムの日付と時刻を設定する方法については、別の投稿から恥知らずに盗まれた次のコードが機能します。

procedure SetSystemDateTime(aDateTime: TDateTime);
var
  lSystemTime: TSystemTime;
  lTimeZone: TTimeZoneInformation;
 begin
  GetTimeZoneInformation(lTimeZone);
  aDateTime := aDateTime + (lTimeZone.Bias / 1440);
  DateTimeToSystemTime(aDateTime, lSystemTime);
  setSystemTime(lSystemTime);
end;
于 2008-10-10T07:40:14.027 に答える
3

VCLにはdouble型のタイプ(TDateおよびTDateTime)があり、算術演算で使用できます。

EncodeDateおよびDecodeDateも参照してください

于 2008-10-03T18:05:51.647 に答える
0

SysUtilsユニットにはたくさんのヘルパーがいます(そしてgabrが指摘したように、DateUtilsにもあります)。

于 2008-10-03T21:38:04.573 に答える