Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Ora legale o solare ?

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    107

    Ora legale o solare ?

    Ciao,

    ho un problema con il get di un'orario da un DB INFORMIX. Gli orari su questo DB sono in UTC; per calcolarmi l'orario corretto devo fare

    UTC + 1 in caso di ora solare
    UTC + 2 in caso di ora legale

    C'è un modo per sapere tramite codice java se siamo in ora legale o solare ?
    Questo metodo secondo voi può andare bene ?

    codice:
    import java.util.*;
    
    public class Prova5{
    private static Calendar cal;
    public static String oraLegale(){
    	cal=Calendar.getInstance();
    	String ora="Ora ";
    	int day=cal.get(Calendar.DAY_OF_MONTH );
    
    	int month=cal.get(Calendar.MONTH);
    	System.out.println("Day "+day +" month "+month +" Year "+cal.get(Calendar.YEAR));
    	if(month<Calendar.APRIL){
    		if(month==Calendar.MARCH && ultimaSettimana(month,day))
    		ora+=" Legale";
    		else ora+=" Solare";
    		}else if(month>Calendar.SEPTEMBER){
    			if(month==Calendar.OCTOBER && !ultimaSettimana(month,day))
    					ora+=" Legale";
    			else ora+=" Solare";
    			}else ora+=" Legale";
    
    	return ora;
    
    	}
    
    public static boolean ultimaSettimana(int month,int day){
    	int d=day;
    	int day_week=cal.get(Calendar.DAY_OF_WEEK );
    
    	if(day_week==Calendar.SUNDAY && (d+7)>giorniMese(month))
    		return true;
    	else if(d>trovaDomenica(d,month,day_week)) return true;
    	return false;
    
    	}
    
    public static int trovaDomenica(int d,int month,int day_week){
    
    	int dw=day_week;
    	for (int i=d;i<=giorniMese(month);i++){
    		if(dw>7) dw=1;
    		if(dw==Calendar.SUNDAY) {return i;}
    		dw++;
    		}
    	return -1;
    
    	}
    
    public static int giorniMese(int month){
    	int a=cal.get(Calendar.YEAR);
    	int d=0;
    	switch(month){
    				case 0:case 2 :case 4 :case 6 :case 7 :case  9 :case 11 :d =31; break;
    				case 1: d= (a%4==0) ? 29:28;break;
    				default : d =30;
    
    		}//switch
    
    	return d;
    
    	}
    
    public static void main(String []args){
    	System.out.println(oraLegale());
    	}
    }
    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Fammi capire: è un problema che riguarda solo la visualizzazione di date???
    e in questo caso è assolutamente necessario sto cambio?

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    107
    Si, io su DB ho l'ora di un evento e la devo visualizzare correttamente a video .....

    Da wikipedia l'ora legale inizia l'ultima domenica di marzo e termina l'ultima di ottobre !

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    si ho capito, ma il tuo calcolo diventa parecchio articolato.
    cosa è che non funziona nel tuo codice? Onestamente provarlo per dirti ok e non ok non mi va (e non è lo scopo del forum).

    l'algoritmo non è facile da scrivere (oltretutto lo hai anche scritto a metà):

    1. le eccezioni sono solo per i mesi marzo/ottobre. Gli altri devi vedere se sei dopo marzo e prima di ottobre ora legale, prima marzo e dopo ottobre ora solare.
    2. per marzo e ottobre: cerca l'ultima domenica del mese e in base a quello ti comporti di conseguenza.

    Guarda

    qui

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    107
    Non capisco perchè dici che l'algoritmo è scritto a metà ... sembra funzionare con data di oggi (oraLegale = false) e 28 marzo 2011 (oraLegale = true)

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ok e allora quale è il problema (se esiste?)

    a me già basta vedere maggiore di aprile per fermarmi e dire che hai scritto a metà...perché aprile non rientra nei casi???maggiore di marzo.
    Ti ripeto io tratterei prima i casi speciali (marzo e ottobre) e poi con una condizione ben scritta fai prima

    es.
    codice:
    if (month==Calendar.MARCH){
       //Cerca l'ultima domenica di marzo
    }else if (month==Calendar.OCTOBER){
      //cerca l'ultima domenica di ottobre
    }else if (month < Calendar.March && month > Calendar.OCTOBER){
     //LEGALE
    }else {
      //SOLARE
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    107
    ops doppio post

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    107
    Credo di aver trovato un metodo migliore; prendo il zone_offset delll'ora che cè sul server (mi darà 1 fino all'ultima domenica di marzo) e sommo questo offset all'ora che prendo da DB

    graziee

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Puoi fare ancora meglio, ovvero non sbatterti a fare i conti (ovvero, ci avevo sbattuto il grugno personalmente qualche tempo fa)
    codice:
    import java.util.*;
    import java.text.*;
    /**
     *
     * @author Andrea
     */
    public class TimeZones {
    
        SimpleDateFormat parser = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss z");
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        TimeZone zone = TimeZone.getTimeZone("Europe/Rome");
    
        public TimeZones() {
            try {
                Date d = parser.parse("25/02/2011 14:30:00 UTC");
                formatter.setTimeZone(zone);
                System.out.println("Locale: "+formatter.format(d));
                d = parser.parse("25/04/2011 14:30:00 UTC");
                formatter.setTimeZone(zone);
                System.out.println("Locale: "+formatter.format(d));
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main (String[] args) {
            new TimeZones();
        }
    
    
    }
    quindi basta creare due SimpleDateFormat ad-hoc e settare il TimeZone, al resto si arrangia da solo, incluso il calcolo di ora legale/solare.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    bravo Andrea, io cercavo una roba del genere (e immaginavo che giocando coi simpledateformat si risolvesse il problema), ma dal lavoro avrebbe chiesto una vera e propria ricerca che non avevo tempo di fare.

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.