@AshotBes

Как из даты,которую ввёл пользователь,отнять текущую дату?

Задача такова: я должен сравнить две даты (date - от пользователя,и текущую дату currentTime) Брать дату от пользователя и отнимать текущую дату - и получаю разницу в днях.И эта разница должна быть не более чем 16 То есть дата от пользователя должна быть не раньше текущей (чтобы не улететь в прошлое), но не позже чем "текущая + 16 дней"

getDateFromUser :: IO (Either UserError Date)
 getDateFromUser = do
     Prelude.putStrLn "Пожалуйста, укажите дату для прогноза в формате    ГГГГ-ММ-ДД:"
     date <- Prelude.getLine
     currentTime <- getCurrentTime
     let forecastDay = parseTimeM True defaultTimeLocale "%Y-%m-%d" date :: Maybe Day
     if date >= ...
        then return $ Right $ (Data.Text.pack date)
        else return $ Left InvalidDate
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
youngmysteriouslight
@youngmysteriouslight
ТК, ТТ, JS, FP, WM
сравнить две даты [...] отнимать текущую дату - и получаю разницу в днях. И эта разница должна быть не более чем 16 То есть дата от пользователя должна быть не раньше текущей (чтобы не улететь в прошлое), но не позже чем "текущая + 16 дней"

-- количество дней (но не меньше 0 и не больше 16) от сего дня (today) до указанного дня (day)
-- возвращаемое число лежит в интервале [0, 16]
strippedDayDiff :: Day -> Day -> Integer
strippedDayDiff day today = let d = diffDays day today in if d > 16 then 16 else if d < 0 then 0 else d

Использование:
if strippedDayDiff forecastDay (utctDay currentTime) >= ...

Если нужно проверить, что разница лежит ровно в диапазоне [0, 16], то
diffDaysIn0_16 day today = let d = diffDays day today in 0 <= d && d <= 16


P.S. Сергей, там есть более узкоспециализированные функции. Думаю, основная проблема изначально состояла в том, что в коде не были проставлены типы и/или выбор возвращаемых значений не соответствует поставленной устно задаче.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
butteff
@butteff
Раз в тысячу лет заправляю свитер в носки
Я не знаю haskell

Но суть такая:
1. Взять текущий unixtimestamp
2. Сконвертировать дату от пользователя в unixtimestamp
3. Из первого вычесть второй
4. От получившегося результата сконвертировать снова дату.

Как я понял, функции для всего этого имеются.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы