我如何获得榆树当前时间?

z5h*_*z5h 19 time elm

我正在运行elm-repl来玩这种语言.

我想看看现在的时间.我该怎么办?当前库似乎不可能.这是为什么?


编辑:我做了一个包来帮助解决这个问题.http://package.elm-lang.org/packages/z5h/time-app

这被问到榆树0.15左右 - 榆树0.17和0.18的情况有所不同:请参阅如何获得榆树当前时间0.17/0.18?

Sim*_*n H 17

更新0.18这再次变得更简单.现在您只需要一个命令和Msg来处理结果

type Msg
    = OnTime Time.Posix 

getTime : Cmd Msg
getTime = 
    Task.perform OnTime Time.now 
Run Code Online (Sandbox Code Playgroud)

看到这个艾莉

原始答案

0.17,这使得更容易.时间库中现在有一个任务.例如,我们现在有:

type Msg
    = OnTime Time 

getTime : Cmd Msg
getTime = 
    Task.perform OnTime Time.now 
Run Code Online (Sandbox Code Playgroud)


pdo*_*926 11

您可以使用Time包和/或Date包.

这是一个人为的例子,它使用了两个:

import Signal
import Time exposing (every, second)
import Date exposing (year, hour, minute, second, fromTime)
import Graphics.Element exposing (show)

main =
  Signal.map currentTime (Time.every Time.second)

currentTime t =
  let date' = fromTime t
      hour' = toString (Date.hour date')
      minute' = toString (Date.minute date')
      second' = toString (Date.second date')
      year' = toString (year date')
      now = "The current time is: " ++ hour' ++ ":" ++ minute' ++ ":" ++ second'
  in 
      show now
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是那些会迅速拒绝从业者使用功能语言的具体事情之一.您正在编写解码器来解析收到的消息,基本上您没有优雅的方法将时间戳粘贴到它们上,除非它们已经附带了一个.感觉有点像智能手机,如果你先将她添加为联系人,你只能打电话给某人.... (9认同)
  • @Gabor - 任何编写单元测试来覆盖执行getSystemTime()调用的代码的人都可以证明,在给定相同参数的情况下,很难测试执行不同操作的代码.通过功能方法,单元测试实际上变得快乐!练习者应该喜欢这个.好吧,你可以使用依赖注入或猴子补丁,但我们知道这些解决方案不太令人满意. (3认同)

z5h*_*z5h 8

为了解决我自己的问题,我创建了一个StartApp变体,其中包含每个操作的时间戳.
所以更新功能有签名:
update : action -> Time -> model -> (model, Effects action)

要点就在这里. https://gist.github.com/z5h/41ca436679591b6c3e51


rof*_*rol 6

榆木0.19

在下面,我将初始时间设置为unix时间开始Time.millisToPosix 0,但是您可以将其设置为Nothing,以后再设置为Just time或将其传递给Flag

module Main exposing (main)

import Browser
import Html exposing (Html)
import Task
import Time exposing (Posix)


main : Program () Model Msg
main =
    Browser.element
        { init = \_ -> init
        , view = view
        , update = update
        , subscriptions = \_ -> Sub.none
        }



-- MODEL


type alias Model =
    { zone : Time.Zone
    , now : Posix
    }


init : ( Model, Cmd Msg )
init =
    ( Model Time.utc (Time.millisToPosix 0), Task.perform Zone Time.here )



-- UPDATE


type Msg
    = Zone Time.Zone
    | Now Posix


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        Zone zone ->
            ( { model | zone = zone }, Task.perform Now Time.now )

        Now now ->
            ( { model | now = now }, Cmd.none )



-- VIEW


formatTime zone posix =
    (String.padLeft 2 '0' <| String.fromInt <| Time.toHour zone posix)
        ++ ":"
        ++ (String.padLeft 2 '0' <| String.fromInt <| Time.toMinute zone posix)
        ++ ":"
        ++ (String.padLeft 2 '0' <| String.fromInt <| Time.toSecond zone posix)


view : Model -> Html Msg
view model =
    Html.div []
        [ Html.text <| formatTime model.zone model.now
        ]
Run Code Online (Sandbox Code Playgroud)


cas*_*son 5

如果您想要从程序启动开始的时间,您可以执行以下操作:

Now.elm

module Now where

import Native.Now

loadTime : Float
loadTime = Native.Now.loadTime
Run Code Online (Sandbox Code Playgroud)

本地/ Now.js

Elm.Native.Now = {};

Elm.Native.Now.make = function(localRuntime) {

  localRuntime.Native = localRuntime.Native || {};


  localRuntime.Native.Now = localRuntime.Native.Now || {};

  if (localRuntime.Native.Now.values) {
    return localRuntime.Native.Now.values;
  }

  var Result = Elm.Result.make(localRuntime);

  return localRuntime.Native.Now.values = {
    loadTime: (new window.Date).getTime()
  };

};
Run Code Online (Sandbox Code Playgroud)

你的代码

programStart = Now.loadTime
Run Code Online (Sandbox Code Playgroud)