Search code examples
dateelm

Elm : How to get YESTERDAY date in String Date


Let's say I have this Model:

type alias Model =
    { currentDate : String 
    , yesterdayDate : String
    }

The CurrentDate I got from Html input type date (Date Picker) is in format YYYY-MM-DD

Html Form

input [ name "date", type_ "date", onInput UpdateDate ] []

Update.elm

UpdateDate date ->
    let 
        -- Get Yesterday Date function here
    
    in
        ( { model | currentDate = date, yesterdayDate = "" }, Cmd.none )

In this situation , how can i get yesterday Date in String ? My idea is parse the day into INT and using subtraction method to get Yesterday day but I cannot find any way to do it... Any help is appreciate.


Solution

  • Convert the string date to Posix, convert the Posix to milliseconds since epoch, subtract the amount of milliseconds in a day, convert the resulting milliseconds back to Posix and the Posix to an ISO8601 string. Take the first 10 characters from that string.

    module Main exposing (main)
    
    import Browser
    import Html exposing (Html, button, div, text)
    import Html.Events exposing (onClick)
    import Iso8601
    import Time exposing (Posix)
    
    
    sampleDate =
        "2020-05-01"
    
    
    subtractDays : Int -> Posix -> Posix
    subtractDays days time =
        (Time.posixToMillis time - (days * 24 * 60 * 60 * 1000))
            |> Time.millisToPosix
    
    
    subtractDaysFromIsoDate : Int -> String -> String
    subtractDaysFromIsoDate days date =
        Iso8601.toTime date
            |> Result.map (subtractDays days >> Iso8601.fromTime >> String.left 10)
            |> Result.withDefault date
    
    
    main =
        text <| subtractDaysFromIsoDate 1 sampleDate
    

    Note that in this implementation if the string is not a valid date it will just be returned unmodified rather than fail. You might want to capture that this operation can fail.