2013-11-06 4 views
0

У меня есть API, который принимает дату как строку в качестве параметра запроса. По большей части, я ожидаю, что мои пользователи отправят необязательный параметр даты в формате «yyyyMMdd», поэтому пример будет 2013/10/12 за 12 октября 2013 года. Затем я ищу записи в MongoDB и/или кеше для определенных данных, которые соответствует указанной дате. Код, который у меня есть, превращает строку в нечто, что является нормальным в Scala, является следующим:Scala refactor string to Date code

def parseDate(date: String): org.joda.time.DateTime = { 
    val formatter = DateTimeFormat.forPattern("yyyyMMdd") 
    formatter.parseDateTime(date) 
} 

Это прекрасно работает. Теперь проблема заключается в том, что пользователь не отправляет дату, я хочу по умолчанию использовать сегодняшнюю дату. Здесь мне нужна помощь. У меня нет отличного способа превратить его в строку, чтобы перейти к этому методу. У меня есть код, который выглядит следующим образом:

val gdate = params.getOrElse("gamedate", "0") 
val date = gdate match { 
    case gd:String => MyDateTimeHelper.parseDate(gd) 
} 

Это, очевидно, неправильно. Я думал, что я мог бы, возможно, сделать:

val gdate = params.getOrElse("gamedate", new DateTime) 

Но это тоже не решение (я предполагаю, что это будет просто обойти матч, так как это уже экземпляр дата и не строка

Что достойный путь. ?., чтобы решить эту проблему в Scala Я просто jodatime для Scala, чтобы помочь мне со всеми проблемами типа Date/Time

+0

если вы хотите datatime Params игнорироваться вы можете просто добавить: случай Г.Д.: DateTime => и пусть он просто возвращает Г.Д. и выполняет договор, как его уже будучи дата. или я понял, что вы ошибаетесь? –

+0

Теперь он делает правильную вещь, он берет строку и превращает ее в DateTime, предполагая, что клиент передает соответствующую форматированную дату как «yyyyMMdd». Но если он по умолчанию «0» в качестве моего кода, мне нужен способ перевести это на сегодняшнюю дату в виде строки, сегодня будет «20131106». Я должен был бы проверить, если он по умолчанию «0» и преобразовать его в это значение, если это так, а затем превратить его в дату для дальнейшей обработки. – randombits

+0

, но вы можете использовать «явно неправильный код» и изменить свой оператор соответствия? –

ответ

1

Вы хотите Вариант и карта:

val gdate:Option[String] = params.get("gamedate") 
val date:Option[DateTime] = gdate map { MyDateTimeHelper.parseDate _ } 
val dateOrDefault:DateTime = date.getOrElse(new DateTime) 
+0

Спасибо, это было прекрасно. Именно то, что мне нужно. – randombits

0

Вы также можете использовать util.Try, который ИМО более читабельен.

Это Try эквивалент ответа pedrofurla.

val gdate:Try[String] = params.get("gamedate") 
val date:Try[DateTime] = gdate map { MyDateTimeHelper.parseDate _ } 
val dateOrDefault:DateTime = date match { 
    case Success(d) => d 
    case Failure(e) => new DateTime // also print out the exception? 
}