Visualizzazione risultati 1 fino 10 di 10

Discussione: date personalizzato

  1. #1
    provact non è connesso Utente giovane
    Data registrazione
    23-12-2009
    Messaggi
    40

    Predefinito date personalizzato

    Ciao ragazzi.
    All'interno di una tabella MySql ho un campo date chiamato UltimiSoldi.
    All'interno di un codice appena inserito (tutto correttamente funzionante) sono incappato in un piccolo problema legato all'orario.
    Per farla in breve:

    Codice PHP:
    if ($UltimiSoldi < strftime("%Y-%m-%d")) {

    azione + update UltimiSoldi a NOW
    }
    Messo così, il codice si avvia solo basandosi sul cambio data.
    Se io invece volessi impostare non solo la data ma anche un orario specifico (tipo: giorno dopo DOPO le 3 di notte)? Come mi converrebbe agire?

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Un campo DATE memorizza la sola informazione sulla data, non sull'orario: potresti utilizzare un campo DATETIME anziché DATE, e confrontare i timestamp.

  3. #3
    provact non è connesso Utente giovane
    Data registrazione
    23-12-2009
    Messaggi
    40

    Predefinito

    Una cosa così, quindi (faccio l'esempio di 6 ore avanti):

    Codice PHP:
    if ($UltimiSoldi < date("H:i d-m-Y",time()+21600)) {

    azione + update UltimiSoldi a NOW
    }
    Ultima modifica di provact : 05-10-2016 alle ore 20.03.22

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Pensavo piuttosto a:
    Codice PHP:
    if (strtotime($UltimiSoldi) < time() + 21600) {
    ...
    }
    in modo da realizzare il confronto tra date come confronto tra interi anziché stringhe, rendendolo così indipendente dal formato (strtotime).

  5. #5
    provact non è connesso Utente giovane
    Data registrazione
    23-12-2009
    Messaggi
    40

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Pensavo piuttosto a:
    Codice PHP:
    if (strtotime($UltimiSoldi) < time() + 21600) {
    ...
    }
    in modo da realizzare il confronto tra date come confronto tra interi anziché stringhe, rendendolo così indipendente dal formato (strtotime).
    Purtroppo non mi viene riconosciuto.
    Ho pensato che l'errore fosse nell'IF in quanto prima faccio una cosa simile (funzionante)

    Codice PHP:
    $query = mysql_num_rows(mysql_query("SELECT * FROM Banca Where bla bla);
    if (
    $query == 6 && strtotime($UltimiSoldi) < time() + 21600) {
    ...
    }
    Ho provato quindi a fare una cosa più macchinosa:

    Codice PHP:
    //memorizzo singolarmente giorno mese anno ora minuti e secondi
    $ora=date("H");
    $min=date("i");
    $giorno=date("d");
    $sec=date("s");
    $mese=date("m");
    $anno=date("Y");
    //sommo in questo caso 6 ore (ma posso anche aggiungere giorni..)
    $scadenza=date('d m Y H:i:s',strtotime("+0 days 6 hours",mktime($ora,$min,$sec,$mese,$giorno,$anno)));

    $query = mysql_num_rows(mysql_query("SELECT * FROM Banca Where bla bla);
    if (
    $query == 6 && $UltimiSoldi < $scadenza) {
    ...
    }
    Ma niente uguale y.y

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Purtroppo non mi viene riconosciuto.
    Cosa ottieni e cosa, invece, vorresti ottenere?

    Con questo codice
    Codice PHP:
    if (strtotime($UltimiSoldi) < time() + 21600) {
    ...
    }
    il ramo then viene eseguito a condizione che $UltimiSoldi (sia esso data o combinazione data-orario) sia antecedente a sei ore nel futuro a partire da adesso. Siccome sembra che il campo UltimiSoldi venga aggiornato impostandolo al momento corrente, sembra che il corpo dell'if sia destinato ad essere sempre eseguito. Se questo corrisponde o meno a ciò che vuoi ottenere, puoi saperlo solo tu .

    L'unica possibile fonte di problemi con strtotime è che la stringa deve rappresentare la data in un formato riconosciuto e supportato, ma fintantoché usi DATE o DATETIME nella base di dati, questo è automaticamente verificato.

    Ho provato quindi a fare una cosa più macchinosa:
    Ed anche più inutile: memorizzando, in $scadenza, la data nel formato "d m Y H:i:s", il confronto nella condizione dell'if diventa un confronto tra stringhe, quindi alfabetico. Di conseguenza, il 5 maggio 3999 risulta antecedente al 6 maggio 1999, perché "5" < "6". Se proprio vuoi usare il confronto tra stringhe anziché timestamp, devi adottare il formato "Y m d H i s".

  7. #7
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    mzanella é pieno di &nbsp; vi insegno un trucco nel caso di file utf-8.. dopo aver creato e salvato il file apritelo nuovamente con una codifica diversa (iso-8859-1 o windows-1252).
    Questo é il contenuto del tuo script aperto in iso-8859-1
    Codice PHP:
    //memorizzoÂ*singolarmenteÂ*giornoÂ*meseÂ*annoÂ*oraÂ*minutiÂ*eÂ*secondi
    $ora=date("H");
    $min=date("i");
    $giorno=date("d");
    $sec=date("s");
    $mese=date("m");
    $anno=date("Y");
    //sommoÂ*inÂ*questoÂ*casoÂ*6Â*oreÂ*(maÂ*possoÂ*ancheÂ*aggiungereÂ*giorni..)
    $scadenza=date('dÂ*mÂ*YÂ*H:i:s',strtotime("+0Â*daysÂ*6Â*hours",mktime($ora,$min,$sec,$mese,$giorno,$anno)));
    va precisato che &nbsp; in utf-8 vale due bytes (sempre un carattere con utf-8).
    Scusate io devo andare a lavoro.
    Ultima modifica di darbula : 06-10-2016 alle ore 15.15.16

  8. #8
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Sei sicuro che l'if venga eseguita?? prova cosi
    Codice PHP:
    <?php
    if (($var = ($query == 6 && $UltimiSoldi < $scadenza))) {
    ...
    }
    var_dump($var);
    ?>
    così saprai se l'if è eseguito sia esso vero o no come nel mio codice senza &nbsp;.
    Codice PHP:
    <?php
    error_reporting
    (E_ALL | E_NOTICE | E_STRICT | E_DEPRECADED);
    ini_set("display_errors" , "stdout");
    ini_set("display_startup_errors" , 1);
    if ((
    $var = (($var2 = $query) == 6 && $UltimiSoldi < $scadenza))) {
    '...';
    }
    var_dump($var, $var2);
    ?>
    Anche se le mie variabili non sono valorizzate php li trasforma in NULL e $var risulta bool(false) NULL e notice perchè ho impostato cosi lo scripr invece d'errore di sintassi alla linea due cioè prima di ... (tuo codice precedente)
    sarebbe neccessario abilitare anche error_reporting per il motivo di cui ho spiegato prima.
    Ultima modifica di darbula : 06-10-2016 alle ore 23.23.54

  9. #9
    provact non è connesso Utente giovane
    Data registrazione
    23-12-2009
    Messaggi
    40

    Predefinito

    Scusate il ritardo, ho avuto due giorni al lavoro infernale.
    Comunque niente, continua a darmi il solito problema (Anche se il datetime di UltimiSoldi è settato su NOW il then, che non dovrebbe avviarsi, si avvia).

    La faccio in breve.
    Il codice è pensato affinché il then si realizzi una sola volta al giorno.

    Vale a dire che se l'if viene applicato, ad esempio, il 7/10/2016 alle ore 17:38, fino alle ore 6:00:00 del 8/10/2016 non sarà eseguibile più perché UltimiSoldi non rispetta questo limite temporale.

    Il mio obiettivo/dubbio è proprio su questa sfumatura (per semplificare al massimo dei sistemi: se il codice a inizio pagina, l'attuale, si avvia a partire da mezzanotte, io vorrei farlo partire alle 6 del mattino).

    Il codice attuale, essendo solo un DATE, agisce con il cambio giorno (non mi da' nessun problema):

    Codice PHP:
    if ($query == 4 && $UltimiSoldi < strftime("%Y-%m-%d")) {

    azione + update UltimiSoldi a NOW
    }
    Ultima modifica di provact : 08-10-2016 alle ore 10.19.01

  10. #10
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Il codice è pensato affinché il then si realizzi una sola volta al giorno.
    È una condizione ben diversa da quella indicata nei primi messaggi, ed è verificata in due modi:
    • se sono passate più di 24 ore dall'istante dell'ultima azione, l'azione è sempre possibile
    • se sono passate meno di 24 ore, è sufficiente che l'ultima azione sia stata eseguita prima delle 6.00, e che ora siano almeno le 6.00

    È sufficiente che almeno una delle due condizioni sia verificata, quindi possono essere rese con una disgiunzione non esclusiva:
    se sono passate più di 24 ore oppure (l'azione è avvenuta prima delle 6.00 di oggi e le 6.00 sono passate)
    Che tradotto in pseudo-codice diventa:
    Codice:
    if (
        istante_corrente - istante_ultima azione >= 24 h
        or (istante_ultima_azione < oggi_alle_6 and istante_corrente >= oggi_alle_6)
        
    ) {
        istante_ultima_azione = adesso
    }
    Il quale si traduce a sua volta in PHP:
    Codice PHP:
    $now = time();
    $this_morning = strtotime('today 6:00');
    $last_action = strtotime($UltimiSoldi);
    if (
    $now - $last_action >= (24 * 60 * 60) || ($last_action < $this_morning && $now >= $this_morning)) {
    update ...
    }
    Usando i timestamp non solo hai il vantaggio di avere un codice indipendente dal formato della data, ma eviti anche i confronti tra stringhe e problemi con il timezone.

    PS: È sottinteso che il campo UltimiSoldi sia di tipo DATETIME, in modo da memorizzare anche l'orario dell'azione, oltre alla data.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •