【问题标题】:Elm : How to get YESTERDAY date in String DateElm:如何在字符串日期中获取 YESTERDAY 日期
【发布时间】:2020-05-12 00:00:52
【问题描述】:

假设我有这个模型:

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

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

HTML 表单

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

更新.elm

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

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

【问题讨论】:

标签: date elm


【解决方案1】:

将字符串日期转换为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

注意,在这个实现中,如果字符串不是一个有效的日期,它只会原封不动地返回,而不是失败。您可能想要捕获此操作可能会失败。

【讨论】:

  • 感谢您回答@pdamoc。我在 ISO8601 发现问题。不允许使用 STRING。
  • 你到底是什么意思?上面的代码在 Ellie 中运行良好:ellie-app.com/8QxB5ngK6rja1
【解决方案2】:

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

你应该问自己的问题:

  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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多