如何将 Erlang:timestamp() 转换为普通日期格式?



我想将erlang:timestamp((的结果转换为正常的日期类型,公历类型。

正常日期类型表示"日-月-年,小时:分钟:秒"。

ExampleTime = erlang:timeStamp(),
ct:pal("~p", [ExampleTime]).

这显示{1568,869478,181646}

我想这个单位是第二个,但不确定它代表什么。

如何使用代码及其概念进行转换。 更具体一点,我不知道,但举个例子,

{1568, 869478, 181646} == {年+月,日,小时+分钟}.

请看文档 erlang:timestamp((,它说

erlang:timestamp(( -> timestamp

类型

时间戳 = 时间戳((

时间戳(( =

{MegaSecs :: integer() >= 0,
Secs :: integer() >= 0,
MicroSecs :: integer() >= 0}

以 {MegaSecs, Secs, MicroSecs} 格式返回当前 Erlang 系统时间...

然后 stdlib 库的模块日历提供了几个转换函数,例如 calendar:now_to_datetime(现在(:

1> calendar:now_to_datetime({1568,869478,181646}).
{{2019,9,19},{5,4,38}}

这是我的代码:

{{Y,M,D},{ H,MM,SS}} = calendar:now_to_datetime({MegaSecs,Secs,MicroSecs }),
lists:flatten(io_lib:format("~B-~2.10.0B-~2.10.0B ~2.10.0B:~2.10.0B:~2.10.0B", [Y, M, D,H,MM,SS])).
% result like 2019-09-18 12:00:00

在从erlang:timestamp()转换为人类可读的时间戳时,我一直在使用这个函数:

format_utc_timestamp(TS, Separator) ->
{_,_,Micro} = TS,
{{Year,Month,Day},{Hour,Minute,Second}} = 
calendar:now_to_universal_time(TS),
io_lib:format("~4w-~2..0w-~2..0w~s~2..0w:~2..0w:~2..0w.~6..0w",
[Year,Month,Day,Separator,Hour,Minute,Second,Micro]).

其中TS{MegaSecs, Secs, MicroSecs}的时间戳值,Separator是用于漂亮打印时间戳的字符串。这将为您提供格式,T作为分隔符:

2019-09-25T10:19:19.020202 

如果您想获取 ISO 8601 时间戳,您可以在上述函数的最后一行进行以下格式化:

io_lib:format("~4w-~2..0w-~2..0wT~w:~2..0w:~2..0wZ", [Year,Month,Day,Hour,Minute,Second])

这将导致2014-09-22T20:53:44Z

下面是生成 ISO 8601 格式的示例:

1> {{Year, Month, Day}, {Hour, Min, Sec}} = calendar:now_to_datetime(erlang:timestamp()).
{{2019,9,19},{15,7,3}}
2> list_to_binary(io_lib:format("~.4.0w-~.2.0w-~.2.0wT~.2.0w:~.2.0w:~.2.0w.0+00:00", [Year, Month, Day, Hour, Min, Sec])).
<<"2019-09-19T15:07:03.0+00:00">>

或者您可以使用erlang:universaltime()代替calendar:now_to_datetime(erlang:timestamp())获取世界时

最新更新