Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [JAVA] Formattare una <String data> in un tipo <Date data>

    Gentili navigatori del forum,

    Come da titolo avrei bisogno di convertire una 'data = "gg/mm/yyyy" ' tipo String in Date(con stessa formattazione),

    Posto il codice:


    codice:
    //From String to Date
    
    public static Date dateFormat(String data, Locale locale) {
    
     
     
    data = Data.covertiSeprators(data, "-", "/");
    
     
             
    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
    
     
     df.setLenient(false);
    
    
    
     
     try {
    
     
             Date dataFrm = df.parse(data);
    
     
     return dataFrm;
    
     
             } catch(ParseException e) {
    
     
     returnnull;
    
             }
    
          
    }
    
    
    //From Date to String
    
      public static String dateFormat(Date data, Locale locale) {
    
    
    
              Date Format df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
    
     
     
    df.setLenient(false);                
    
     
             
    String data Format = df.format(data);
    
     
     
    dataFormat = Data.covertiSeprators(dataFormat, "/", "-");
    
     
     
    return dataFormat;
    
    
    
     
          }
    
    //Dove locale = Locale.ITALIAN
    
    
    



    Con questi metodi, funziona solo se la data è nel formato "gg/mm/yyyy" (Locale.ITALIAN)
    Se la data è in Inglese, ovvero se viene recuperata dal DB, come dovrei procedere?
    Nella Tabella/Entity del DB ho il campo da leggere:

    codice:
      @Temporal(TemporalType.DATE)
    
     @DateTimeFormat (pattern="dd-mm-yyyy")
    
     @Column(name="data")
    
     private Date data;
    
    
    
    
    Ultima modifica di jabjoint; 04-02-2023 a 16:05
    jabjoint

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da jabjoint Visualizza il messaggio
    Con questi metodi, funziona solo se la data è nel formato "gg/mm/yyyy" (Locale.ITALIAN)
    Se la data è in Inglese, ovvero se viene recuperata dal DB, come dovrei procedere?
    Su DB la colonna della data di che tipo è? Se è una stringa (varchar o altro a seconda del db), è comunque poco appropriato.

    Comunque non ci sono solo i DateFormat forniti dai getDateInstance, puoi anche usare SimpleDateFormat a cui si passa un pattern esplicitamente. (è brutto fare logiche: sostituisci da "-" a "/").
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ciao @andbin Sul DB la colonna della data è proprio tipo "Date".

    Ho risolto in qualche modo. Forse non troppo pulito, con la funzione java.sql.Date.valueOf(stringa), che converte da una tipo String di data ma nel formato yyyy-mm-dd al tipo del Date del DB.

    Mi preoccupo di splittare(i vari separatori"-")(funzione split) ed assicurarmi che sia nel formato inglese.

    Successivamente con al funzione:
    java.sql.Date.
    valueOf(data_str);




    la converto in data per il DB.

    Posto per chi avesse la stessa difficoltà il codice della classe Data che ho realizzato:

    Tra cui c'è anche la funzione dei giorni rimanenti da oggi ad una data assegnata(spero sia corretta):
    Ultima modifica di jabjoint; 07-02-2023 a 20:15
    jabjoint

  4. #4
    Non posso allegare la classe intera perché eccede nei caratteri:

    codice:
       
    public static int giorniRimanenti(String data, int paese){
     
     
                 data = Data.convertSeprators(data, "/", "-");
    
     
     int aS = getYear(data, paese);
    
     int mS = getMonth(data, paese);
     int dS = getDay(data, paese);
    
     
     int d = LocalDate.now().getDayOfMonth();
     int m = LocalDate.now().getMonthValue();
    
     int a = LocalDate.now().getYear();
     
                 //System.out.println("Oggi: "+d+"//"+m+"//"+a);
                 //System.out.println("Scadenza: "+dS+"//"+mS+"//"+aS);
      
     int g=0;
     
     while (!(a>=aS && m>=mS && d>=dS)) {
     
                     YearMonth yM = YearMonth.of(a, m);
     int gM = yM.lengthOfMonth();    
    
     
     if (a<=aS) {
     if (m==12 && d==31) { a++; m=1; d=1; }                    
                     }
     
     if (d==gM) { 
     if (d==gM) d=1; elsed++;
     if (m<12) m++;
     else if (m==12) m=1;                
                     }
     else d++;
     
     g++;                        
    
     
     //System.out.println(a+","+m+","+d);
                 }
     
     returng;
     
         }
    
    
    codice:
      
    
    public static String convertSeprators(String data, String fromSeparetor, String toSeparetor) {
     return data.replace(fromSeparetor, toSeparetor);
      }
    
     
     
     public static Date toSql(Data data) {        
     
      String data_str = Data.convertSeprators(data.toTxtEng(), "/", "-");
     
      //System.out.println("*Data:"+data_str);
     
     return java.sql.Date.valueOf(data_str);
     
      }
     
      
    
    
    Ultima modifica di jabjoint; 07-02-2023 a 20:12
    jabjoint

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Non solo non è pulito, ma è anche oltremodo laborioso ed error-prone.
    Se io ho una data che mi arriva come String nel formato "gg/mm/aaaa" (all'italiana, insomma) e devo farci dei calcoli sopra per poi trasferirla in un campo DATE del DB, si può fare più semplicemente così:

    codice:
    String dataCheMiArriva = ...;   // La data che mi arriva come String nel formato gg/mm/aaaa
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    
    try {
       java.util.Date data = sdf.parse( dataCheMiArriva );
    
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime( data );
    
       // Faccio tutti i calcoli con il GregorianCalendar (aggiungo/sottraggo giorni/mesi/anni/quel che vuoi)
       ...
    
       java.sql.Date dataDaSalvareInDB = new java.sql.Date( gc.getTimeInMillis() );
    
       // uso l'oggetto "dataDaSalvareInDB" con una PreparedStatement e relativo metodo setDate()
       salvaInDB( dataDaSalvareInDB );
    } catch (Exception e) {
       // Mi è arrivata una schifezza, che faccio? Boh...
       e.printStackTrace();
    }
    
    ...
    
    private void salvaInDB(Date dataDaSalvare) {
       // con =  L'Oggetto Connection che rappresenta la connessione col DB
       PreparedStatement pstmt = null;
       try {
          pstmt = con.prepareStatement("INSERT INTO tabella(campoData) VALUES(?)");
          pstmt.setDate(1, dataDaSalvare);
          pstmt.executeUpdate();
       } catch (Exception e) {
          e.printStackTrace();
       } finally {
          if (pstmt != null) {
             try { pstmt.close(); } catch (Exception e) { }
          }
       }
    }

    Nessuno sbattimento a tokenizzare la stringa di partenza.
    Nessuno sbattimento a fare verifiche sui valori dei campi tokenizzati
    Nessuno sbattimento nel convertire gli slash ( / ) in trattini ( - )
    Nessun problema di conversione della data nel formato stringa più appropriato per il DB in uso: lo fa il driver JDBC.


    Ciao.
    Ultima modifica di LeleFT; 08-02-2023 a 13:32
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.