2016-08-03 1 views
1

J'essaie d'obtenir LocaDate par le format donc je pris cette fonction qui reçoivent la date et la recherche pour le format pour analyser:Scala comment obtenir LocalDate par modèle

def getLocalDate(date: String): LocalDate = { 

    val pattern1 = DateTimeFormatter.ofPattern("dd MMM, yyyy") 
    val pattern2 = DateTimeFormatter.ofPattern("dd MMM yyyy") 
    val pattern3 = DateTimeFormatter.ofPattern("yyyy-MMM-dd") 
    val pattern4 = DateTimeFormatter.ofPattern("dd/MM/YYYY") 
    val pattern5 = DateTimeFormatter.ISO_LOCAL_DATE 

    val result = Try { 
     LocalDate.parse(date, pattern1) 
    } recover { 
     case _ => LocalDate.parse(date, pattern2) 
    } recover { 
     case _ => LocalDate.parse(date, pattern3) 
    } recover { 
     case _ => LocalDate.parse(date, pattern4) 
    } recover { 
     case _ => LocalDate.parse(date, pattern5) 
    } 

    result.get 
    } 

Utilisation:

var s1 = "01/08/2010" 
getLocalDate(s1) 

Mais a une erreur:

java.time.format.DateTimeParseException: Text '01/08/2010' could not be parsed at index 0 

Et je ne sais pas pourquoi et ce qui ne va pas.

+0

Je ne sais pas scala mais il semble que vous deviez encapsuler chaque appel LocalDate.parse dans un bloc try. –

+3

Je suppose que votre exemple de date "01/08/2010" doit correspondre au motif 4, mais il utilise majuscule "YYYY" au lieu de "yyyy". – devkat

+0

Même erreur avec YYYY ou aaaa –

Répondre

3
import java.time.LocalDate 
import java.time.format.DateTimeFormatter 

import scala.util.Try 

def getLocalDate(date: String): java.time.LocalDate = { 
    val pattern1 = DateTimeFormatter.ofPattern("dd MMM, yyyy") 
    val pattern2 = DateTimeFormatter.ofPattern("dd MMM yyyy") 
    val pattern3 = DateTimeFormatter.ofPattern("yyyy-MMM-dd") 
    val pattern4 = DateTimeFormatter.ofPattern("dd/MM/yyyy") 
    val pattern5 = DateTimeFormatter.ISO_LOCAL_DATE 

    val result = Try { 
    LocalDate.parse(date, pattern1) 
    } recover { 
    case _ => LocalDate.parse(date, pattern2) 
    } recover { 
    case _ => LocalDate.parse(date, pattern3) 
    } recover { 
    case _ => LocalDate.parse(date, pattern4) 
    } recover { 
    case _ => LocalDate.parse(date, pattern5) 
    } 

    result.get 
} 
var s1 = "01/08/2010" 
getLocalDate(s1) 

Cela fonctionne bien dans REPL (Scala 2.11.8, Java 1.8). Votre erreur était d'inclure "YYYY" dans le dernier motif au lieu de "yyyy". Jetez également un coup d'œil au paquet nscala-time. Peut-être que cela fournira de meilleures liaisons pour vos applications.