Elm:如何在字符串日期中获取昨天日期

Elm : How to get YESTERDAY date in String Date

假设我有这个模型:

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

我从 Html input type date(日期选择器)得到的 CurrentDate 的格式是 YYYY-MM-DD

Html表格

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

Update.elm

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

在这种情况下,如何在字符串中获取昨天的日期? 我的想法是将 day 解析为 INT 并使用减法方法得到昨天,但我找不到任何方法来做到这一点...任何帮助都非常感谢。

将字符串日期转换为 Posix,将 Posix 转换为纪元以来的毫秒数,减去一天中的毫秒数,将得到的毫秒数转换回 Posix 和Posix 到 ISO8601 字符串。从该字符串中取出前 10 个字符。

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

请注意,在此实现中,如果字符串不是有效日期,它将不加修改地返回,而不是失败。您可能想要捕获此操作可能会失败的信息。

因为您可以相信您从 html 获得了有效的字符串格式并且了解 date package,您可以将日期字符串拆分为 3 个字符串,将每个字符串转换为整数,然后将今天和昨天构造为 Date 值。

您应该问自己的问题:

  1. 您真的要将日期存储为 String 吗? Date 类型可能更有用,如果你想做其他事情然后只显示字符串值。
  2. 您真的要同时存储今天和昨天吗?后者可以在需要时轻松计算。

字符串拆分示例:

case
    String.split "-" date
        |> List.map String.toInt
of
    [ Just year, Just monthInt, Just day ] ->
         -- convert monthInt to `Month`
         -- construct current date
         -- add -1 `Day`
         Debug.todo "todo" 2

    _ ->
        Debug.todo "invalid date format" date