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

    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
    ISSlive , un bot per Telegram per trovare tutti i passaggi visibili della Stazione Spaziale Internazionale.

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,972
    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...
    ISSlive , un bot per Telegram per trovare tutti i passaggi visibili della Stazione Spaziale Internazionale.

  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,972
    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
    }
    ISSlive , un bot per Telegram per trovare tutti i passaggi visibili della Stazione Spaziale Internazionale.

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 © 2020 vBulletin Solutions, Inc. All rights reserved.