Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2020
    Messaggi
    9

    Creare ICS con ora solare anziché legale.

    Ciao a tutto, spero in un vostro aiuto.
    Ho una pagina php che mi gestisce gli eventi in un calendario e mi genera un link dove l'utente può scaricarsi l'ICS per outlook o altro e il link aggiungere l'evento al calendario google.
    Per gestire l'ora legale o solare uso la funzione date(I) in questo modo

    codice:
    
    
    codice:
    //GESTIONE CALENDARI ****************************************************************************************************************
    if (date('I') == 1)
    	$oraInizioEventoIcs = substr($array["orain"], 0, strpos($array["orain"], ":")) - 1 . substr($array["orain"], strpos($array["orain"], ":")) . ":00+01:00";
    else
    	$oraInizioEventoIcs = $array["orain"] . ":00+01:00";	
    
    
    $dataOraInizioEventoIcs = $array["annoin"] . "-" . $array["mesein"] . "-" . $array["giornoin"] . "T" . $oraInizioEventoIcs;
    
    
    if (date('I') == 1)
    	$oraInizioEventoGoogle = substr($array["orain"], 0, strpos($array["orain"], ":")) - 2 . substr($array["orain"], strpos($array["orain"], ":"));
    else
    	$oraInizioEventoGoogle = substr($array["orain"], 0, strpos($array["orain"], ":")) - 1 . substr($array["orain"], strpos($array["orain"], ":"));
    
    
    $dataOraInizioEventoGoogle = $array["annoin"] . "-" . $array["mesein"] . "-" . $array["giornoin"] . " " . $oraInizioEventoGoogle;
    
    
    $oraInizioEventoYahoo = str_replace(":", "", substr($array["orain"], 0, strpos($array["orain"], ":")) . substr($array["orain"], strpos($array["orain"], ":"))) . "00";
    $meseInizioEventoYahoo = strlen($array["mesein"]) == 1 ? "0" . $array["mesein"] : $array["mesein"];
    $giornoInizioEventoYahoo = strlen($array["giornoin"]) == 1 ? "0" . $array["giornoin"] : $array["giornoin"];
    $dataOraInizioEventoYahoo = $array["annoin"] . $meseInizioEventoYahoo . $giornoInizioEventoYahoo . "T" . $oraInizioEventoYahoo;
    
    
    if ($array["oraout"] != "")
    {
    	if (date('I') == 1)
    		$oraFineEventoIcs = substr($array["oraout"], 0, strpos($array["oraout"], ":")) - 1 . substr($array["oraout"], strpos($array["oraout"], ":")) . ":00+01:00";
    	else
    		$oraFineEventoIcs = $array["oraout"] . ":00+01:00";
    	
    	if (date('I') == 1)
    		$oraFineEventoGoogle = substr($array["oraout"], 0, strpos($array["oraout"], ":")) - 2 . substr($array["oraout"], strpos($array["oraout"], ":"));
    	else
    		$oraFineEventoGoogle = substr($array["oraout"], 0, strpos($array["oraout"], ":")) - 1 . substr($array["oraout"], strpos($array["oraout"], ":"));
    	
    	$oraFineEventoYahoo = str_replace(":", "", substr($array["oraout"], 0, strpos($array["oraout"], ":")) . substr($array["oraout"], strpos($array["oraout"], ":"))) . "00";
    	$oraFineEventoYahoo = strlen($oraFineEventoYahoo) < 6 ? "0" . $oraFineEventoYahoo : $oraFineEventoYahoo;
    }
    else
    {
    	if (date('I') == 1)
    		$oraFineEventoIcs = $array["orain"] . ":00+01:00";
    	else
    		$oraFineEventoIcs = substr($array["orain"], 0, strpos($array["orain"], ":")) + 1 . substr($array["orain"], strpos($array["orain"], ":")) . ":00+01:00";
    	
    	$oraFineEventoGoogle = substr($oraInizioEventoGoogle, 0, strpos($oraInizioEventoGoogle, ":")) + 1 . substr($oraInizioEventoGoogle, strpos($oraInizioEventoGoogle, ":"));
    	
    	$oraFineEventoYahoo = str_replace(":", "", substr($array["orain"], 0, strpos($array["orain"], ":")) + 1 . substr($array["orain"], strpos($array["orain"], ":"))) . "00";
    	$oraFineEventoYahoo = strlen($oraFineEventoYahoo) < 6 ? "0" . $oraFineEventoYahoo : $oraFineEventoYahoo;
    }
    
    
    if ($array["annoout"] != "" && $array["meseout"] != "" && $array["giornoout"] != "")
    {
    	$dataOraFineEventoIcs = $array["annoout"] . "-" . $array["meseout"] . "-" . $array["giornoout"] . "T" . $oraFineEventoIcs;
    	
    	$dataOraFineEventoGoogle = $array["annoout"] . "-" . $array["meseout"] . "-" . $array["giornoout"] . " " . $oraFineEventoGoogle;
    	
    	$meseFineEventoYahoo = strlen($array["meseout"]) == 1 ? "0" . $array["meseout"] : $array["meseout"];
    	$giornoFineEventoYahoo = strlen($array["giornoout"]) == 1 ? "0" . $array["giornoout"] : $array["giornoout"];
    	$dataOraFineEventoYahoo = $array["annoout"] . $meseFineEventoYahoo . $giornoFineEventoYahoo . "T" . $oraFineEventoYahoo;
    }
    else
    {
    	$dataOraFineEventoIcs = $array["annoin"] . "-" . $array["mesein"] . "-" . $array["giornoin"] . "T" . $oraFineEventoIcs;
    
    
    	$dataOraFineEventoGoogle = $array["annoin"] . "-" . $array["mesein"] . "-" . $array["giornoin"] . " " . $oraFineEventoGoogle;
    	
    	$meseFineEventoYahoo = strlen($array["mesein"]) == 1 ? "0" . $array["mesein"] : $array["mesein"];
    	$giornoFineEventoYahoo = strlen($array["giornoin"]) == 1 ? "0" . $array["giornoin"] : $array["giornoin"];
    	$dataOraFineEventoYahoo = $array["annoin"] . $meseFineEventoYahoo . $giornoFineEventoYahoo . "T" . $oraFineEventoYahoo;
    }




    questo controllo funziona benissimo tranne se un utente cerca di aggiungere un evento collocato dopo il 25 Ottobre, quindi nell'ora solare, in questo cosa mi genera un ics con un'ora in meno (questo perchè la funzione date restituisce 1, quindi per lui siamo nell'ora legale anche se l'evento sarà nell'ora solare).

    Come posso risolvere secondo voi?
    Ultima modifica di onny88; 12-10-2020 a 14:57

  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,521
    Prova a postare il testo del ICS, se no non si capisce nulla...
    Probabilmente non stai aggiungendo il time zone che determina dove viene o no utilizzato il metodo "solare/legale"

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2020
    Messaggi
    9
    Quote Originariamente inviata da U235 Visualizza il messaggio
    Prova a postare il testo del ICS, se no non si capisce nulla...
    Probabilmente non stai aggiungendo il time zone che determina dove viene o no utilizzato il metodo "solare/legale"

    il time zone non mi interessa perchè sarà utilizzato solo in italia. Vorrei determinare, partendo da una data fornita in INPUT, se in questa data sarà in vigore l'ora legale o meno perchè mi serve generare l'ICS con l'ora dell'evento corretta.

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,521
    Quote Originariamente inviata da onny88 Visualizza il messaggio
    il time zone non mi interessa perchè sarà utilizzato solo in italia. Vorrei determinare, partendo da una data fornita in INPUT, se in questa data sarà in vigore l'ora legale o meno perchè mi serve generare l'ICS con l'ora dell'evento corretta.
    Usando il time zone la cosa è automatica. Per il resto sintatticamente in PHP non saprei, ma la cosa dovrebbe essere abbastanza semplice per un programmatore medio: controlli se si tratta di una data oltre l’ultima domenica di ottobre, e questo lo ottieni più o meno facilmente in base al linguaggio che usi. In bocca al lupo.

    p.s. Ricorda che il client che riceve l’invito al contrario di quanto fai sul server potrebbe comunque tenere in considerazione il time zone e quindi in alcuni casi potresti trovare orari sbagliati.
    Ultima modifica di U235; 12-10-2020 a 16:13

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    189
    php usa UTC proielittico (non esiste il leap second) e da php 5.4 una data guarda avanti o indietro (periodo di transizione) anche per una data con il timezone supportato.
    Se la data è in un formato convertibile usa la classe DateTime e il timezone Europe/Rome come secondo argomento così avrai sempre la transazione (non quella sottrazione scorretta)
    Codice PHP:
    $st = new DateTime('2020-10-25 03:00:00.000000', new DateTimeZone('Europe/Rome'));
    echo 
    $st->format('Y-m-d H:i:s'); //periodo di transizione indietro
    //offset +3600 secondi, ergo UTC +01:00
    //echo $st->getOffset();
    $dst = new DateTime('2020-10-25 01:00:00.000000', new DateTimeZone('Europe/Rome'));
    echo 
    $dst->format('Y-m-d H:i:s'); //periodo di transizione avanti corrente
    //offset +7200 secondi, ergo UTC +02:00 
    //echo $dst->getOffset(); 
    https://wiki.php.net/rfc/datetime_an...ht_saving_time
    Ultima modifica di darbula; 12-10-2020 a 16:54

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