Search code examples
scalalocaldate

Scala how to get LocalDate by pattern


I try to get LocaDate by format so i took this function that receive date and search for format to parse:

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
  }

Usage:

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

But got an error:

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

And i don;t know why and what goes wrong.


Solution

  • 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)
    

    This works nicely in REPL (Scala 2.11.8, Java 1.8).

    Your mistake was to include "YYYY" in last pattern instead of "yyyy". Also, take a look at package nscala-time. Maybe it will provide better bindings for your applications.