La gestione delle date con il linguaggio Harbour

Lo scopo di questo articolo è scoprire le potenzialità del linguaggio Harbour per la gestione delle date. Gli esempi che seguono sono assimilabili a un gioco molto divertente e appassionante. Tanta potenza e flessibilità a disposizione dell'utente e del programmatore per poter effettuare qualsiasi operazione sulle date. L'utilizzo delle funzioni e delle procedure può avvenire tanto in modalità interattiva quanto in un ambiente di programmazione.

Introduzione

Abbiamo molte volte parlato del linguaggio Harbour in altri nostri precedenti articoli. Si tratta di un potente linguaggio di programmazione che permette di utilizzare al massimo tutto ciò che la tecnologia informatica mette oggi a disposizione.

RDDs, SQL, ODBC, JSON, SSL, TCP/IP, XML, Windows, Linux, espressioni regolari, gestione degli oggetti e tanto altro è facilmente accessibile da tale linguaggio di programmazione. In questo articolo focalizziamo la nostra attenzione esclusivamente sulla gestione delle date e sulle operazioni relative ad esse. Si vedrà come la gestione temporale sia semplice e potente al tempo stesso.

Dopo aver scaricato e installato Harbour (consigliamo vivamente di utilizzare la versione nightly) possiamo iniziare subito la nostra sessione di lavoro, eseguendo i seguenti passi:

  • Accediamo alla finestra di terminale (con il comando "CMD" da Windows);
  • Impostiamo il percorso di ricerca con il comando "path c:\hb32\bin;c:\hb32\comp\mingw\bin";
  • Digitiamo il comando "hbrun" seguito dal tasto invio;
  • Impartiamo il comando "setmode(40,120)" per rendere ottimali le dimensioni della finestra di lavoro.

Modo comando

Se tali semplici operazioni sono state eseguite correttamente, si dovrebbe vedere la videata di cui alla Figura 1. Ci troviamo, in questo momento, in modo comando e il prompt è rappresentato da un punto posto alla sinistra dello schermo. Il sistema attende le nostre istruzioni.

Figura 1: il linguaggio Harbour in modo comando

Figura 1: il linguaggio Harbour in modo comando

La prima operazione da compiere è quella della configurazione del sistema delle date in italiano. Di default, infatti, Harbour gestisce quella inglese. Impartiamo dal punto, pertanto, i seguenti due comandi, seguiti sempre dal tasto invio:

set date italian

set century on

Il primo comando imposta, come facilmente intuibile, la data nel formato italiano (gg-mm-aa), mentre il secondo predispone la visualizzazione dell'anno mediante quattro cifre (gg-mm-aaaa). Le altre possibili nazionalità sono: AMERICAN, Ansi, British, French, German, Italian, Japan e USA. I relativi pattern di visualizzazione sono i seguenti indicati in tabella:

AMERICAN mm/dd/yy
ANSI yy.mm.dd
BRITISH dd/mm/yy
FRENCH dd/mm/yy
GERMAN dd.mm.yy
ITALIAN dd-mm-yy
JAPAN yy/mm/dd
USA mm-dd-yy

Le funzioni basilari sulle date

Bene, adesso che tutto è stato predisposto e la nazionalità è stata impostata, possiamo impartire alcune funzioni fondamentali, per prendere confidenza con il sistema ma, soprattutto, per constatarne la sua potenza.

Che giorno è oggi?

Sono numerose le funzioni che interrogano l'orologio di sistema. Proviamo a digitare il seguente comando:

? date()

Il punto interrogativo è usato come ordine di visualizzazione a video. Stiamo chiedendo ad Harbour di mostrare la data corrente, ovvero quella di oggi. Dopo aver premuto il tasto invio, il sistema visualizza il messaggio con la data odierna.

Se non avessimo impartito le precedenti configurazioni, sarebbe stata mostrata la data nel formato inglese.

Proviamo a inoltrare, adesso, il comando:

? dow(date())

Il sistema, in risposta, fornisce un numero. Cosa vuol dire? Il risultato ottenuto si riferisce al giorno della settimana, secondo l'insieme "Dom, Lun, Mar, Merc, Gio, Ven, Sab".

Ma c'è di più, impartendo il comando:

? cdow(date())

otterremo, in risposta, proprio il giorno della settimana.

Un'altra funzione da provare è "dtos()" che ha lo scopo di convertire una data in una stringa nel formato "aaaammgg". Ad esempio, il comando:

? dtos(date())

restituirà la stringa con la data.

In che giorno sei nato?

Le funzioni esaminate prima utilizzano, come parametro, una informazione in formato "data" e non "stringa". Si supponga, adesso, di voler sapere in che giorno della settimana (Lun, Mar, etc.) si è nati. Per questo scopo occorre impartire il seguente comando:

? cdow(ctod("07/01/1967"))

che darà, in output, la risposta di Sabato. In questo modo si può scoprire il giorno della settimana corrispondente a qualsiasi evento passato e futuro. Davvero molto comodo. La funzione "ctod", come si può comprendere, effettua la conversione da tipo "stringa" a tipo "data".

Operazioni aritmetiche sulle date

La possibilità di agire matematicamente sulle date è fornita da pochi linguaggi. Ed Harbour è uno tra questi. Operare sulle date con somme e sottrazioni è una grande comodità in mille occasioni e il programmatore deve compiere davvero pochissimo lavoro nell'implementare questi calcoli, ben sicuro che il motore svolgerà correttamente il suo lavoro e, soprattutto, in maniera veloce ed esente da errori. Alcuni esempi chiarificheranno al meglio tali concetti.

La differenza tra due date

Due persone sono nate, rispettivamente, l'1 gennaio 1942 e il 7 gennaio 1967. Si vuol conoscere, tramite il linguaggio Harbour, la differenza della loro età, espressa in giorni. Nulla di più semplice, è sufficiente impartire il seguente comando:

? ctod("07/01/1967")-ctod("01/01/1942")

per avere subito in risposta 9137 giorni. Questa possibilità può rivelarsi estremamente utile e importante alle aziende che hanno bisogno di calcolare date di scadenze, pagamenti, durata di contratti e altro ancora.

La somma e differenza di data

Un'altra particolarità delle operazioni aritmetiche sulle date è quella di poter sommare o sottrarre dei giorni a una certa scadenza. Per esempio, un'azienda deve terminare il lavoro di una commessa entro 250 giorni dalla stipula del contratto, avvenuta il 28 ottobre 2016. A quale data corrisponde tale scadenza? Basta eseguire una semplice somma:

? ctod("28/10/2016") + 250

per ottenere, in uscita, la scadenza della fine dei lavori. Potete verificare voi stessi, calendario alla mano. Lo stesso calcolo può essere applicato alla scadenza delle fatture (30gg, 60gg, 90gg) o ad altre mille occasioni simili.

Un altro esempio potrebbe essere il seguente. Che data era 20000 giorni fa?

E' ovvio che le operazioni di moltiplicazione e divisione non hanno alcun senso per le date.

Troviamo tutti i venerdì 17

Sento spesso persone che nel giorno del venerdi 17 non escono di casa per paura di eventi spiacevoli. Scaramanzia a parte (vedi Figura 2), vediamo come Harbour permette di trovare facilmente tale giorno della settimana. Si tratta di scandire, in un ciclo nidificato, tutti i mesi di tutti gli anni (entro l'intervallo desiderato, ovviamente). Occorre, quindi, controllare se il giorno della settimana della data formata corrisponde al valore 6. Nel qual caso si può stampare la data. Il semplice listato è mostrato sotto.

FUNCTION Main ()
   LOCAL a, d, m
   SET DATE italian
   SET CENTURY ON
   FOR a := 2000 TO 2040
      FOR m := 1 TO 12
         d := CToD( "17/" + hb_ntos( m ) + "/" + hb_ntos( a )  )
         IF DoW( d ) == 6
            ? "Il", d, "cade di Venerdi 17"
         ENDIF
      NEXT m
   NEXT a
   RETURN .T.

Occorre creare, tramite un editor di testo, un sorgente dall'estensione .PRG (ad esempio "venerdi.prg". Per eseguirlo, dal prompt dei comandi, si deve digitare il comando "hbrun venerdi.prg". Sul video si vedranno tutti i giorni che cadono di venerdì 17, compresi tra il 2000 e il 2040.

Il 17-03-2000 cade di Venerdi 17
Il 17-11-2000 cade di Venerdi 17
Il 17-08-2001 cade di Venerdi 17
Il 17-05-2002 cade di Venerdi 17
Il 17-01-2003 cade di Venerdi 17
Il 17-10-2003 cade di Venerdi 17
Il 17-09-2004 cade di Venerdi 17
Il 17-12-2004 cade di Venerdi 17
Il 17-06-2005 cade di Venerdi 17
Il 17-02-2006 cade di Venerdi 17
Il 17-03-2006 cade di Venerdi 17
Il 17-11-2006 cade di Venerdi 17
Il 17-08-2007 cade di Venerdi 17
Il 17-10-2008 cade di Venerdi 17
Il 17-04-2009 cade di Venerdi 17
Il 17-07-2009 cade di Venerdi 17
Il 17-09-2010 cade di Venerdi 17
Il 17-12-2010 cade di Venerdi 17
Il 17-06-2011 cade di Venerdi 17
Il 17-02-2012 cade di Venerdi 17
Il 17-08-2012 cade di Venerdi 17
Il 17-05-2013 cade di Venerdi 17
Il 17-01-2014 cade di Venerdi 17
Il 17-10-2014 cade di Venerdi 17
Il 17-04-2015 cade di Venerdi 17
Il 17-07-2015 cade di Venerdi 17
Il 17-06-2016 cade di Venerdi 17
Il 17-02-2017 cade di Venerdi 17
Il 17-03-2017 cade di Venerdi 17
Il 17-11-2017 cade di Venerdi 17
Il 17-08-2018 cade di Venerdi 17
Il 17-05-2019 cade di Venerdi 17
Il 17-01-2020 cade di Venerdi 17
Il 17-04-2020 cade di Venerdi 17
Il 17-07-2020 cade di Venerdi 17
Il 17-09-2021 cade di Venerdi 17
Il 17-12-2021 cade di Venerdi 17
Il 17-06-2022 cade di Venerdi 17
Il 17-02-2023 cade di Venerdi 17
Il 17-03-2023 cade di Venerdi 17
Il 17-11-2023 cade di Venerdi 17
Il 17-05-2024 cade di Venerdi 17
Il 17-01-2025 cade di Venerdi 17
Il 17-10-2025 cade di Venerdi 17
Il 17-04-2026 cade di Venerdi 17
Il 17-07-2026 cade di Venerdi 17
Il 17-09-2027 cade di Venerdi 17
Il 17-12-2027 cade di Venerdi 17
Il 17-03-2028 cade di Venerdi 17
Il 17-11-2028 cade di Venerdi 17
Il 17-08-2029 cade di Venerdi 17
Il 17-05-2030 cade di Venerdi 17
Il 17-01-2031 cade di Venerdi 17
Il 17-10-2031 cade di Venerdi 17
Il 17-09-2032 cade di Venerdi 17
Il 17-12-2032 cade di Venerdi 17
Il 17-06-2033 cade di Venerdi 17
Il 17-02-2034 cade di Venerdi 17
Il 17-03-2034 cade di Venerdi 17
Il 17-11-2034 cade di Venerdi 17
Il 17-08-2035 cade di Venerdi 17
Il 17-10-2036 cade di Venerdi 17
Il 17-04-2037 cade di Venerdi 17
Il 17-07-2037 cade di Venerdi 17
Il 17-09-2038 cade di Venerdi 17
Il 17-12-2038 cade di Venerdi 17
Il 17-06-2039 cade di Venerdi 17
Il 17-02-2040 cade di Venerdi 17
Il 17-08-2040 cade di Venerdi 17

Figura 4: un corno portafortuna

Figura 2: un corno portafortuna

Come si nota, gli anni 2006, 2017, 2020, 2023 e 2034 hanno ben tre "venerdì 17".

Due venerdì 17 consecutivi

Il seguente programma è una variazione del precedente in quanto cerca due venerdì 17 appartenenti a due mesi consecutivi. In un range compreso tra il 1900 e il 2100, l'evento si ripete per più di 20 volte: [...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3027 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici e potrai fare il download in formato PDF eBook e Mobi per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend