2012-01-13 19 views
8

Utilizzando Delphi, ho bisogno di una funzione per valutare la data corrente e vedere se è, ad esempio, la terza domenica del mese, ecc. .Primo [lunedì] del mese, Secondo [giovedì] del mese, ecc. Delphi

In pseudocodice:

function IsFirst(const CurrentDateTime: TDateTime; const Day: Word): Boolean; 
/// Day can be 1-7 (monday to sunday) 
begin 
    Result:= ?? 
end; 

Un'altra funzione sarebbe necessaria per calcolare il secondo, terzo, quarto e ultimo del mese. DateUtils sembra non avere niente del genere. Qualche idea?

+1

E cosa hai provato finora? –

+0

La tua funzione non ha alcun tipo di risultato, la tua intenzione non è chiara dal codice o dal testo della tua domanda. –

risposta

13

Questa funzione è quello che vi serve:

function IsFirst(const DateTime: TDateTime; const Day: Word): Boolean; 
begin 
    Result := (DayOfTheWeek(DateTime)=Day) and 
    InRange(DayOfTheMonth(DateTime), 1, 7); 
end; 

La funzione equivalente per la seconda occorrenza è:

function IsSecond(const DateTime: TDateTime; const Day: Word): Boolean; 
begin 
    Result := (DayOfTheWeek(DateTime)=Day) and 
    InRange(DayOfTheMonth(DateTime), 8, 14); 
end; 

Sono sicuro che è possibile compilare i dettagli per il terzo, quarto e quinto . Potresti preferire scrivere una singola funzione generale come questa:

function IsNth(const DateTime: TDateTime; const Day: Word; 
    const N: Integer): Boolean; 
var 
    FirstDayOfWeek, LastDayOfWeek: Integer; 
begin 
    LastDayOfWeek := N*7; 
    FirstDayOfWeek = LastDayOfWeek-6; 
    Result := (DayOfTheWeek(DateTime)=Day) and 
    InRange(DayOfTheMonth(DateTime), FirstDayOfWeek, LastDayOfWeek); 
end; 
4

Questo può essere fatto utilizzando una semplice matematica.

Ottieni lo DayOfTheWeek e divide lo DayOf di sette.

+0

Sì, probabilmente significa 'mod'. –

+0

Intendevo 'DayOf' che dovrebbe dare lo stesso risultato di' DayOfTheMonth', avrei dovuto separarlo in due frasi. Il punto era che puoi farlo usando la matematica semplice. La risposta di Davids va bene. –

+0

@DavidHeffernan - Non stavo indicando la risposta, solo la parte "divide per". Mi rifiuto codardamente di codificare qualsiasi cosa relativa al calcolo della data dopo aver visto i componenti interni dei moduli Perl 'DateTime'. –

Problemi correlati