Date 当前日期

Date 当前日期,date,elm,Date,Elm,在elm中,我有一个模型包含一个currentDate,它是一个表示日期的字符串。我用一个信号更新它: Signal.map (SetCurrentDate << timeToDateString) (Time.every Time.second) Signal.map(SetCurrentDate{model | currentDate使用信号 您使用的是StartApp还是您自己的foldp?如果您使用的是StartApp,最好查找start函数的代码并将其内联,这样您就可以访

在elm中,我有一个模型包含一个
currentDate
,它是一个表示日期的字符串。我用一个信号更新它:

Signal.map (SetCurrentDate << timeToDateString) (Time.every Time.second)
Signal.map(SetCurrentDate{model | currentDate使用信号
您使用的是
StartApp
还是您自己的
foldp
?如果您使用的是
StartApp
,最好查找
start
函数的代码并将其内联,这样您就可以访问
foldp

Signal.foldp
对信号的初始值没有任何作用。因此,如果您使用
Time.every second
信号,您只能在一秒钟后获得更新,如果您使用日期转换和
Signal.dropRepeats
,则只能在一天之后获得更新。您可以使用第三方库*来修复此问题。它需要一个函数来完成根据输入的初始值创建
foldp
的初始状态

*完全披露:我是图书馆的作者

使用任务 图书馆里有一个非常有用的任务,叫做。我认为它可以满足你的需要,而不需要每秒更新一次的信号。此外,你可能还可以得到一个每天只检查一到两次时间的东西。

Apanatshka的答案()这是有道理的,但作为Elm的初学者,我在将解释应用于实际代码时遇到了困难。经过一些胡闹之后,以下是呈现自动更新日期所需的最少代码量(使用Elm v0.16.0):

导入信号
导入Html(Html、文本)
导入时间(时间,每个)
导入日期(日期、月、fromTime、年、月、日、小时、分钟、秒)
--不由foldp使用(https://stackoverflow.com/a/34095298/480608)
开始时间=0
类型Action=更新日期
类型别名Model=Date
showDate:日期->字符串
showDate日期=toString(月日)+“”++
toString(日期)++“,”++
toString(年份日期)+“++
toString(小时日期)++“:”++
toString(分钟日期)++“:”++
toString(第二天)
更新:操作->模型->模型
更新(更新日期)\=日期
模型:信号模型
模型=
Signal.foldp更新(fromTime startTime)时钟
时间动作:时间->动作

timeToAction time=Update这似乎工作得很好。非常感谢你给出了非常清晰的答案!我最终也使用了教程中的
getCurrentTime
,因为它与Elm StartApp配合得很好。我真的很想在Elm stdlib中看到类似的东西。我花了很长时间才弄明白这一点。@z5h制作了一个版本的StartUp th更新时间:可能重复@rofrol这个问题是在Elm 0.16是最新版本时提出的。但是,对于当前版本,它确实是同一个问题。
import Signal
import Html exposing (Html, text)
import Time exposing (Time, every)
import Date exposing (Date, Month, fromTime, year, month, day, hour, minute, second)

-- not used by foldp (https://stackoverflow.com/a/34095298/480608)
startTime = 0

type Action = Update Date

type alias Model = Date

showDate : Date -> String
showDate date = toString (month date) ++ " " ++
  toString (day date) ++ ", " ++
  toString (year date) ++ "  " ++
  toString (hour date) ++ ":" ++
  toString (minute date) ++ ":" ++
  toString (second date)

update : Action -> Model -> Model
update (Update date) _ = date

model : Signal Model
model =
  Signal.foldp update (fromTime startTime) clock

timeToAction : Time -> Action
timeToAction time = Update <| fromTime time

clock : Signal Action
clock =
  Signal.map timeToAction <| every Time.second

main : Signal Html
main =
  Signal.map view model

view : Model -> Html
view model =
  text <| showDate model
import Signal
import Html exposing (..)
import Html.Events exposing (..)
import Keyboard
import Char
import Time exposing (Time)
import Date exposing (Date, Month, fromTime, year, month, day, hour, minute, second)

startTime = 0

type Action =
  NoOp
  | Increment
  | Decrement
  | Update Time

type alias Model = {
  count: Int,
  time: Time
}

showDate : Date -> String
showDate date = toString (month date) ++ " " ++
  toString (day date) ++ ", " ++
  toString (year date) ++ "  " ++
  toString (hour date) ++ ":" ++
  toString (minute date) ++ ":" ++
  toString (second date)

actions : Signal.Mailbox Action
actions =
  Signal.mailbox NoOp

update : Action -> Model -> Model
update action model =
  case action of
    NoOp -> model
    Increment -> { model | count = model.count + 1 }
    Decrement -> { model | count = model.count - 1 }
    Update time -> { model | time = time }

model : Signal Model
model =
  Signal.foldp update { count = 0, time = startTime } (Signal.mergeMany [
    actions.signal,
    keyPressesToAction,
    clock
  ])

keyPressesToAction : Signal Action
keyPressesToAction =
  let
    keyCodeToAction keyCode =
      case Char.fromCode keyCode of
        '=' -> Increment
        '-' -> Decrement
        _ -> NoOp
  in
    Signal.map keyCodeToAction Keyboard.presses

timeToAction : Time -> Action
timeToAction time = Update time

clock : Signal Action
clock = Signal.map timeToAction (Time.every Time.second)

main : Signal Html
main =
  Signal.map (view actions.address) model

view : Signal.Address Action -> Model -> Html
view address model =
  div [] [
    text <| showDate <| fromTime model.time,
    div []
      [ button [ onClick address Decrement ] [ text "-" ]
      , text <| toString model.count
      , button [ onClick address Increment ] [ text "+" ]
      ]
  ]