Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924

    HDate: oggetto per operazioni sulle date con method chaining

    HDate è un oggetto in grado di fare operazioni in grado di calcolare la data successiva/precedente ad un certo intervallo di tempo e di calcolare i giorni che intercorrono tra due date.

    L'unica peculiarità di rilievo è l'uso del method chaining, che consente di ottenere degli statement particolarmente espressivi, ad esempio

    codice:
    var dt = new HDate('1978/04/08', 'iso8601');
    if (dt.isValid()) {   
            if (dt.startFrom().hasAtLeast().years(29).months(0).days(0).ofInterval()) {
    ...

    La pagina demo con classe inclusa è su
    http://www.fabriziocalderan.it/code/javascript/hdate/

    Seguiranno sicuramente degli update non appena potrò fare un debug più consistente.
    Al solito non ho ancora prodotto documentazione, ma potete chiedere in questo thread
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    Un po' di howto giusto per incoraggiarvi a provarla

    Creazione dell'oggetto
    codice:
    // formato di default è italiano: 6 gennaio
    objdate = new HDate('06/01/2008'); 
    
    // equivalente alla precedente
    objdate = new HDate('06/01/2008', 'it'); 
    
    // formato inglese: 1 giugno
    objdate = new HDate('06/01/2008', 'en'); 
    
    // formato iso8601: anno/mese/giorno
    objdate = new HDate('2008/06/01', 'iso8601'); 
    
    // Data odierna
    objdate = new HDate();
    Si noti che per definire la data odierna non è necessario stabilire un formato (it, en o iso8601)
    poiché viene creato internamente un oggetto data. Come separatore di data si può usare indistintamente lo slash in avanti (/), il trattino medio (-) o il punto (.), anche in modo misto, ad esempio

    codice:
    objdate = new HDate('06.01-2008', 'it');
    Stabiliamo se la data impostata è valida (se abbiamo istanziato l'oggetto con una data di sistema il controllo di validità non è necessario però è comunque ammissibile):

    codice:
    if (objdate.isValid()) {
       // fai qualcosa
    }


    Dopo aver assicurato la validità della data dell'oggetto (6 gennaio 2008) vogliamo sapere se, ad oggi, da quella data sono passati almeno 58 giorni

    codice:
    if (objdate.startFrom().hasAtLeast().days(58).ofInterval()) {
       // sono passati almeno 58 giorni
    }
    Possiamo anche stabilire casi più complessi : ad esempio nel caso oggi fosse il 9 ottobre sarebbero passati almeno 7 mesi e 2 giorni (sempre a partire dal 6 gennaio)?

    codice:
    if (objdate.startFrom(09/10/2008).hasAtLeast().months(7).days(2).ofInterval()) {
       // sono passati almeno 7 mesi e 2 giorni tra il 6 gennaio e il 9 ottobre
    }
    ma avremmo potuto scrivere la stessa cosa così (in modo più verboso)
    codice:
    if (objdate.startFrom(09/10/2008).hasAtLeast().months(3).months(4).days(1).days(1).ofInterval()) {
       // sono passati almeno 7 mesi e 2 giorni tra il 6 gennaio e il 9 ottobre
    }

    Si noti che la data definita nel metodo startFrom deve coincidere con quella definita in fase di creazione dell'oggetto: ad esempio il seguente codice porta a conseguenze imprevedibili

    codice:
    // i formati inseriti nel costruttore e nel metodo startFrom sono diversi!)
    var objdate = new HDate('2008-06-01', 'iso8601'); 
    if (objdate.startFrom(09/10/2008).hasAtLeast().months(7).days(58).ofInterval()) {
       // sono passati almeno 7 mesi e 1 giorno tra il 6 gennaio e il 9 ottobre
    }

    Un uso pratico: avete un form in cui proponete un servizio valido per chi è maggiorenne ed un campo 'data di nascita'. Se una persona inserisce come data di nascita il 18/03/1990, potete fare un controllo preventivo lato client con un costrutto del tipo

    codice:
    var birthday = new HDate('18/03/1990'); 
    if (birthday.isValid()) {
        if (birthday.startFrom().hasAtLeast().years(18).ofInterval()) {
           // sei maggiorenne
        }
        else {
           var now = new HDate();
           alert ('devi aspettare ancora ' + now.getInterval(birthday) + ' giorni.');
        }
    }

    Per ora può bastare...
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  3. #3
    Bel lavoro Fabrizio, buona anche l'idea di utilizzare uno stile alla jquery.
    Sicuramente lo userò visto che il calcolo delle date è una delle cose che mi rompono più le scatole

    PS: A quando una pagina di presentazione decente?

  4. #4
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    Lo so, perdo più tempo a fare le cose che a presentarle, però gli esempi dovrebbero essere ragionevolmente sufficienti a sfruttare le varie features...

    domani sera farò un pò d'ordine e magari pubblicherò il tutto su googlecode.


    Nota: ho cambiato il nome del metodo 'startFrom' in 'startingFrom': 3 caratteri in più da digitare ma il nome si legge meglio nella catena

    il primo esempio diventerebbe quindi

    codice:
    var objdate = new HDate('2008-06-01', 'iso8601'); 
    if (objdate.startingFrom().hasAtLeast().months(2).days(18).ofInterval()) {
       // sono passati almeno 2 mesi e 18 giorni dal 6 gennaio scorso
    }
    e si può esprimere anche al contrario, ovvero
    codice:
    var objdate = new HDate(0, 'iso8601'); 
    if (objdate.startingFrom(2008.06.01).hasAtLeast().months(2).days(18).ofInterval()) {
       // sono passati almeno 2 mesi e 18 giorni dal 6 gennaio scorso
    }
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.