如何在 Elm 中获取当前日期?

3
我正在尝试找出如何在elm 0.17版本中获取当前日期。我看到他们在0.17版中添加了一个日期模块,但我没有找到任何关于它如何使用的例子。有人找到了如何做到这一点吗?
编辑: 在尝试修改此解决方案时,我遇到了另一个障碍。我正在尝试触发设置日期,然后调用另一个消息来执行其他操作。但是我仍然得到{}作为日期。
import Html.App as App
import Html exposing (..)
import Time exposing (Time)
import Task
import Date exposing (Date)
import Html.Events exposing (onClick)
import Html.Attributes exposing (..)

type alias Model =
  {currentDate : Maybe Date}

type Msg =
  SetDate (Maybe Date)
  | TriggerDateSet

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    SetDate date ->
      ({model | currentDate = date}, Cmd.none)
    TriggerDateSet ->
      (model, now)

view : Model -> Html Msg
view model =
  div []
  [ div []
    [ button [onClick TriggerDateSet] [] ]
  , div [] [ text <| "(Optional) time at program launch was " ++ toString model ]
  ]

now : Cmd Msg
now =
  Task.perform (always (SetDate Nothing)) (Just >> SetDate) Date.now

main : Program Never
main =
  App.program
    { init = ( Model Nothing, now )
    , view = view
    , subscriptions = always Sub.none
    , update = update
    }
2个回答

6
你需要的是 now 任务或 every 订阅来自 Time 的内容。
以下是使用前者以当前时间初始化模型的示例。
import Html.App as App
import Html exposing (..)
import Time exposing (Time)
import Task


type alias Model = 
  Maybe Time


type Msg = 
  SetTime (Maybe Time)


update : Msg -> Model -> (Model, Cmd Msg)
update (SetTime time) _ = 
  (time, Cmd.none)


view : Model -> Html Msg
view model =
  div [] [ text <| "(Optional) time at program launch was " ++ toString model ]


now : Cmd Msg
now = 
  Task.perform (Just >> SetTime) Time.now


main : Program Never
main =
  App.program 
    { init = ( Nothing, now ) 
    , view = view
    , subscriptions = always Sub.none 
    , update = update
    }

2
我试图获取当前日期。使用您的示例,我将所有时间引用替换为日期,但它返回{}。我认为将其移植到js可能会更容易获得它。 - Korbin

3
+1 对@SorenDebois的回答表示赞同。您可以重构日期。可以通过执行以下操作来实现:
myDate = Date.fromTime timeFromMaybe

或者在代码中随处使用Date。以下是完整的示例(改编自其他答案)。

import Html.App as App
import Html exposing (..)
import Date exposing (Date)
import Task


type alias Model = 
  Maybe Date


type Msg = 
  SetDate (Maybe Date)


update : Msg -> Model -> (Model, Cmd Msg)
update (SetDate date) _ = 
  (date, Cmd.none)


view : Model -> Html Msg
view model =
  div [] [ text <| "(Optional) date at program launch was " ++ dateString model ]


dateString : Model -> String
dateString model =
  case model of
    Nothing -> "No date here"
    Just date ->
      "the date is "
      ++ (toString <| Date.dayOfWeek date)
      ++ " "
      ++ (toString <| Date.day date)
      ++ " "
      ++ (toString <| Date.month date)
      ++ " "
      ++ (toString <| Date.year date)

now : Cmd Msg
now = 
  Task.perform (Just >> SetDate) Date.now


main : Program Never
main =
  App.program 
    { init = ( Nothing, now ) 
    , view = view
    , subscriptions = always Sub.none 
    , update = update
    }

我能够将您的答案与上面的答案结合起来,然后开始工作了!谢谢! - Korbin
2
Task.perform 已更改,现在正确的语法是:Task.perform (Just >> SetDate) Date.now - Natim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接